Correspondre regex et attribuer des résultats dans une seule ligne de code
Je veux pouvoir faire une correspondance regex sur une variable et assigner les résultats à 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;
Existe-t-il un moyen plus court/plus simple de le faire? Ai-je raté quelque chose?
8 réponses
Pourquoi voulez-vous qu'il soit plus court? Ne est vraiment de l'importance?
$variable = $1 if $variable =~ /(find something).*/;
Si vous êtes préoccupé par le nom de la variable ou si vous le faites à plusieurs reprises, enveloppez la chose dans un sous-programme et oubliez-la:
some_sub( $variable, qr/pattern/ );
sub some_sub { $_[0] = $1 if eval { $_[0] =~ m/$_[1]/ }; $1 };
Quelle que soit votre implémentation, le but du sous-programme est de le rendre réutilisable afin de donner à un ensemble particulier de lignes un nom court qui se trouve à leur place.
my($variable) = "some string" =~ /(e\s*str)/;
Cela fonctionne parce que
Si l'option
/g
n'est pas utilisée,m//
dans le contexte de la liste renvoie une liste composée des sous-expressions correspondant aux parenthèses dans le motif, c'est-à-dire, ($1
,$2
,$3
...).
Et parce que my($variable) = ...
(notez les parenthèses autour du scalaire) fournit le contexte de la liste à la correspondance.
Si le motif ne correspond pas, $variable
obtient la valeur indéfinie.
Vous pouvez faire la substitution comme:
$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;
$a
est maintenant "stack"
Eh Bien, vous pourriez dire
my $variable;
($variable) = ($variable = "find something soon") =~ /(find something).*/;
Ou
(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;
Presque ....
Vous pouvez combiner la correspondance et récupérer la valeur correspondante avec une substitution.
$variable =~ s/.*(find something).*/$1/;
AFAIK, vous devrez toujours copier la valeur, sauf si vous ne vous souciez pas de clobber l'original.
$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);
$variable1
maintenant, est égal à "overflow"
.
Je fais ceci:
#!/usr/bin/perl
$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"
Du Livre De Cuisine Perl 2nd ed 6.1 copier et remplacer simultanément
$dst = $src;
$dst =~ s/this/that/;
Devient
($dst = $src) =~ s/this/that/;
Je suppose que tout le monde l'a fait de cette façon, étonné que personne ne donne cette réponse.