2010-04-01 14 views
1

Perl permet ...Existe-t-il un idiome Perl qui est l'équivalent fonctionnel de l'appel d'un sous-programme depuis l'opérateur de substitution?

$a = "fee"; 
$result = 1 + f($a) ; # invokes f with the argument $a 

mais autorise pas, ou ne fait pas plutôt ce que je veux ...

s/((fee)|(fie)|(foe)|(foo))/f($1)/ ; # does not invoke f with the argument $1 

La-résultat final souhaité est un moyen d'effectuer une substitution adaptée hors de ce que l'expression rationnelle correspondait.

Dois-je écrire

sub lala { 
    my $haha = shift; 
    return $haha . $haha; 
} 
my $a = "the giant says foe" ; 
$a =~ m/((fee)|(fie)|(foe)|(foo))/; 
my $result = lala($1); 
$a =~ s/$1/$result/; 
print "$a\n"; 

Répondre

12

Voir perldoc perlop. Vous devez spécifier le modificateur e pour que la pièce de rechange soit évaluée.

#!/usr/bin/perl 

use strict; use warnings; 

my $x = "the giant says foe" ; 
$x =~ s/(f(?:ee|ie|o[eo]))/lala($1)/e; 

print "$x\n"; 

sub lala { 
    my ($haha) = @_; 
    return "$haha$haha"; 
} 

sortie:

C:\Temp> r 
the giant says foefoe

Incidemment, éviter d'utiliser $a et $b extérieur de sort blocs tels qu'ils sont paquet spécial des variables scope-tubé spécial pour strict.

+1

Merci! Cela économise beaucoup d'usure sur la touche point-virgule. –