2010-01-24 3 views
1

Que fait cette ligne dans Perl?

my @parsedarray = ($rowcol =~ m/([A-Z]?)([0-9]+)/); 

lig./col de $ est quelque chose comme A1, J8 etc ... et je sais que le script les sépare en quelque sorte parce que les deux lignes suivantes sont les suivants:

my $row = $parsedarray[0]; 
my $col = $parsedarray[1]; 

Je ne peux pas voir que fait cette ligne ($ rowcol = ~ m/([AZ]?) ([0-9] +) /); et comment ça marche.

Répondre

2

L'opérateur m // est une correspondance de motif, fondamentalement un synonyme de //. Cela correspond à une première lettre facultative, puis à un ou plusieurs chiffres dans la colonne de ligne. Un tableau est renvoyé à la suite de la correspondance avec chaque élément contenant l'un des groupes correspondants (entre parenthèses). Par conséquent $ parsedarray [0] contient la lettre (ou rien) et $ parsedarray [1] contient les chiffres.

1

Il:

  • matches contre l'expression régulière (lettres zéro ou plus capitalisées, suivie d'un ou plusieurs numéros.)
  • capture deux groupes:
    • zéro ou plusieurs lettres
    • un ou plusieurs nombres
  • Affecte les groupes capturés à la matrice @parsedarray

de code de l'exemple de test:

use Data::Dumper; 
my $rowcol = "A1"; 
my @parsedarray = ($rowcol =~ m/([A-Z]?)([0-9]+)/); 
print Dumper(\@parsedarray); 

rendement:

$ VAR1 = [ 'A', '1' ];

Notez que si la chaîne avait pas conduit lettre majuscule (par exemple « a1 ») alors il renvoie une chaîne vide pour $parsedarray[0].

0

Mon Perl est un peu rouillé mais si je comprends bien votre question, la réponse est qu'il correspond à l'expression régulière de:

en option une lettre majuscule entre a à z suivi d'un ou plusieurs chiffres du numéro, et cessionnaires

7

([A-Z]?) signifie capturer au plus une lettre majuscule. ([0-9]+) signifie correspondre et capturer au moins un chiffre.

La prochaine fois, vous pouvez installer YAPE::Regex::Explain pour vous dire ce qui se passe. par exemple

use YAPE::Regex::Explain; 
my $regex = "([A-Z]?)([0-9]+)"; 
my $exp = YAPE::Regex::Explain->new($regex)->explain; 
print $exp."\n"; 

Notez que m// dans un contexte de liste retourne toutes les sous-chaînes capturées.

3

brisé en morceaux, c'est ce qui se passe:

my @parsedarray =     # declare an array, and assign it the results of: 
        (
        $rowcol =~  # the results of $rowcol matched against 
           m/ # the pattern: 
           ([A-Z]?) # 0 or 1 upper-case-alpha characters (1st submatch), 
              # followed by 
           ([0-9]+) # 1 or more numeric characters (2nd submatch) 
           /x   # this flag added to allow this verbose formatting 
       );    # ...which in list context is all the submatches 

Donc, si $rowcal = 'D3':

my @parsedarray = ('D3' =~ m/([A-Z]?)([0-9]+)/); # which reduces to: 
my @parsedarray = ('D', '3'); 

Vous pouvez lire sur les expressions régulières en profondeur perldoc perlrequick (un résumé rapide), perldoc perlretut (le tutoriel), et perldoc perlre (tous les détails), et les différentes opérations d'expressions régulières (correspondance, substitution, traduction) au perldoc perlop.