2013-03-27 5 views
1

J'ai le type suivant dans mon fichier de classe:Comment utiliser un type Moose comme expression de correspondance regex?

has 'cardNumber' => (is => 'ro', isa => 'Int', required => 1); 

Je suis en train de faire ce qui suit:

foreach $_ (@accountsInfo) { 
     if ($_ =~ m/^$self->cardNumber()/) { 
      $self->pushing(split(/,/, $_)); 
      $self->invokeAccount(); 
     } 
} 

Mais je ne peux pas le faire pour tester correctement. Si je tape manuellement le nombre que je recherche dans les barres obliques regex cela fonctionne parfaitement. Pouvez-vous s'il vous plaît m'aider à utiliser le type cardNumber?

Répondre

1

Imprimez-le pour voir ce que vous essayez de faire correspondre. Vous obtiendrez des résultats comme SOMECLASS=HASH(0x6bbb48)->foo(). Une solution:

/^@{[$self->cardNumber()]}/ 
+0

Homme JE T'AIME les gars! Fonctionne parfaitement! – BackPacker777

5

règles d'interpolation de Perl état que les réseaux ("@foo") et scalaires ("$bar"), ainsi que (a) des recherches de valeurs de hachage ("$baz{bar}") ou des matrices ("$foo[1]"), et (b) déréférences des cas précédents ("@$foo, $$bar, $baz->{bar}, $foo->[1]") sont interpolés dans des chaînes entre guillemets doubles.

Les appels de fonction et les appels de méthode d'extension ne sont pas interpolés.

Vous pouvez interpoler du code arbitraire dans des chaînes en utilisant une astuce de déréférencement d'une référence anonyme. Habituellement, vous voulez un arrayref:

"foo @{[ expressions; ]} bar"; # interpolating anon hashref 

mais refs scalaires travailler aussi bien (ils sont 1 caractère plus).

"foo ${\(expressions;)}" # interpolating anon scalar ref 

Cependant, vous devriez envisager la mise en cache la valeur que vous voulez interpoler dans une variable scalaire:

my $cardNumber = $self->cardNumber; 
for (@accountsInfo) { 
    if (/\A\Q$cardNumber\E/) { 
    $self->pushing(split /,/); 
    $self->invokeAccount(); 
    } 
} 

Note complémentaire: Je dépouillé parens unneccessary et mentions de $_ de cet extrait de code. En outre, j'ai échappé les caractères dans $cardNumber afin qu'ils correspondent littéralement, et ne sont pas traités comme une regex.

Questions connexes