web-dev-qa-db-fra.com

Que signifie $ 1 en Perl?

Que signifie $ 1 en Perl? De plus, que signifie 2 $? Combien y a-t-il de variables de nombre $?

62
Chad DeShon

Le $number Les variables contiennent les parties de la chaîne correspondant au groupes de capture( ... ) dans le motif de votre dernier match regex si le match a réussi.

Par exemple, prenez la chaîne suivante:

$text = "the quick brown fox jumps over the lazy dog.";

Après la déclaration

$text =~ m/ (b.+?) /;

$1 est égal au texte "brown".

65
rlbond

Les variables numériques sont les correspondances de la dernière opérateur de correspondance ou de substitution réussi (e):

my $string = 'abcdefghi';

if( $string =~ /(abc)def(ghi)/ ) {
    print "I found $1 and $2\n";
    }

Vérifiez toujours que la correspondance ou la substitution a réussi avant d’utiliser $ 1, etc. Sinon, vous pourriez récupérer les restes d’une autre opération.

Les expressions rationnelles Perl sont documentées dans perlre .

34
Jim Puls

$ 1, $ 2, etc. contiendront la valeur des captures de la dernière correspondance réussie - il est important de vérifier si la correspondance a réussi avant d'y accéder, c'est-à-dire.

 if ( $var =~ m/( )/ ) { # use $1 etc... }

Un exemple du problème - $ 1 contient 'Quick' dans les deux instructions d'impression ci-dessous:

#!/usr/bin/Perl

'Quick brown fox' =~ m{ ( quick ) }ix;
print "Found: $1\n";

'Lazy dog' =~ m{ ( quick ) }ix;
print "Found: $1\n";
11
plusplus

Comme d'autres l'ont fait remarquer, les $ x sont des variables de capture pour les expressions régulières, vous permettant de référencer des sections d'un modèle correspondant.

Perl prend également en charge les captures nommées qui peuvent être plus faciles à mémoriser dans certains cas.

entrée donnée: 111 222

/(\d+)\s+(\d+)/

1 $ est 111

2 $ est 222

On pourrait aussi dire:

/(?<myvara>\d+)\s+(?<myvarb>\d+)/

$ + {myvara} vaut 111

$ + {myvarb} vaut 222

9
Einstein

Celles-ci sont appelées "Variables de correspondance". Comme mentionné précédemment, ils contiennent le texte de votre dernière correspondance d'expression régulière.

Plus d'informations ici: http://cslibrary.stanford.edu/108/EssentialPerl.html

(CTRL-F pour 'Match Variables' pour trouver la section correspondante)

6
John T

Puisque vous avez demandé aux groupes de capture, vous voudrez peut-être aussi connaître $ + .. C'est très utile ..

use Data::Dumper;
$text="hiabc ihabc ads byexx eybxx";
while($text=~/(hi|ih)abc|(bye|eyb)xx/igs)
{
    print Dumper $+;
}

SORTIE:
$ VAR1 = 'hi';
$ VAR1 = 'ih';
$ VAR1 = 'bye';
$ VAR1 = 'eyb';

3
Hemanth Gowda

En général, les questions concernant les variables "magiques" dans Perl peuvent être résolues en consultant la documentation des variables prédéfinies de Perl à la page suivante:

perldoc perlvar

Toutefois, lorsque vous effectuez une recherche dans cette documentation pour 1 $, etc., vous trouverez des références à plusieurs endroits, à l’exception de la section consacrée à ces variables "chiffres". Vous devez rechercher

$<digits>

J'aurais ajouté ceci à réponse de Brian soit en commentant ou en éditant mais je n'ai pas assez de représentant. Si quelqu'un ajoute ceci, je supprime cette réponse.

2
benrifkah

Je soupçonne qu'il peut y en avoir autant que 2**32 -1 variables de correspondance numérotées, sur un binaire Perl compilé à 32 bits.

0
Brad Gilbert

Les variables $ 1 .. $ 9 sont également des variables en lecture seule, vous ne pouvez donc pas leur attribuer implicitement une valeur:

$ 1 = 'foo'; print $ 1;

Cela renverra une erreur: Modification d’une valeur en lecture seule tentée à la ligne de script 1.

Vous ne pouvez pas non plus utiliser de nombres pour le début des noms de variables:

$ 1foo = 'foo'; imprimer $ 1foo;

Ce qui précède renverra également une erreur.

0
user118435