Match regex et affecter les résultats dans une seule ligne de code
Je veux être en mesure de faire une regex match sur une variable et de lui affecter les résultats de la variable elle-même. Quelle est la meilleure façon de le faire?
Je veux essentiellement combiner les lignes 2 et 3 en une seule ligne de code:
$variable = "some string";
$variable =~ /(find something).*/;
$variable = $1;
Est-il plus court/moyen plus simple de faire cela? Ai-je raté quelque chose?
Vous devez vous connecter pour publier un commentaire.
Pourquoi voulez-vous qu'il soit plus court? Ne est vraiment de l'importance?
Si vous êtes inquiet au sujet du nom de la variable ou de faire ce à plusieurs reprises, l'envelopper dans un sous-programme et de l'oublier:
Toutefois la mettre en œuvre, le point de la sous-routine est de les rendre réutilisables, afin de vous donner un ensemble de lignes, un nom court qui se tient à leur place.
($variable) = $variable =~ /(find).*/
pour les cas où vous souhaitez explicitement que la condition d'affectation si et seulement si le match œuvres.Cela fonctionne parce que
et parce que
my($variable) = ...
(notez les parenthèses autour de l'scalaire) de fournitures contexte de liste pour le match.Si le modèle ne parvient pas à égaler,
$variable
obtient la valeur undefined.my($foo) = ("bar box" =~ /(soap|box)/);
my($foo) = map ( "prefix_$_", @{["bar box" =~ /(soap|box)/)]} );
. Vous finirais avec "prefix_box" dans ce cas.Vous pouvez faire de la substitution comme:
$a
est maintenant"stack"
Eh bien, vous pourriez dire
ou
Presque ....
Vous pouvez combiner le match et de récupérer le contenu de la valeur avec une substitution.
Autant que je sache, Vous aurez toujours de copier la valeur du bien, à moins que vous ne se soucient pas de tabasser l'original.
$variable1
est maintenant égale à"overflow"
.Je fais ceci:
De Perl livre de recettes 2e éd
6.1 la Copie et la Substitution Simultanée
devient
J'ai supposé que tout le monde a fait de cette façon, étonné de voir que personne n'a donné cette réponse.
s///
), pas un match (m//
). Cela ne ferait-il pas utile, mais c'est pourquoi il n'était pas parmi les réponses initiales.Aussi, pour amplifier la accepté de répondre à l'aide de l'opérateur ternaire pour vous permettre de spécifier une valeur par défaut si aucune correspondance n'est trouvée:
$match
, cela développe le plus upvoted réponse, permettant ainsi le remplacement deundefined
avec*defaultValue*
dans une ligne contenant la déclaration de la variable.