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?

37
demandé sur brian d foy 2010-09-06 19:16:06

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.

24
répondu brian d foy 2010-09-06 19:14:07
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.

55
répondu Greg Bacon 2010-09-06 17:26:07

Vous pouvez faire la substitution comme:

$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;

$a est maintenant "stack"

7
répondu codaddict 2014-07-29 17:34:11

Eh Bien, vous pourriez dire

my $variable;
($variable) = ($variable = "find something soon") =~ /(find something).*/;

Ou

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;
6
répondu Chas. Owens 2010-09-06 15:30:46

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.

4
répondu Peter Tillemans 2014-07-29 17:34:43
$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);

$variable1 maintenant, est égal à "overflow".

4
répondu Dmitri Lihhatsov 2016-07-13 01:53:41

Je fais ceci:

#!/usr/bin/perl

$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"
3
répondu Jet 2014-07-29 17:33:29

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.

1
répondu user3287506 2018-05-11 20:22:34