2010-03-08 4 views
1
$w = 'self-powering'; 
%h = (self => 'self', 
     power => 'pauә', 
    ); 
if ($w =~ /(\w+)-(\w+)ing$/ && $1~~%h && $2~~%h && $h{$2}=~/ә$/) { 
    $p = $h{$1}.$h{$2}.'riŋ'; 
     print "$w:"," [","$p","] "; 
} 

je me attends à la sortie soitPourquoi ce code ne fait pas ce que je veux dire?

self-powering: selfpauәriŋ 

Mais ce que je reçois est:

self-powering: [riŋ] 

Je pense que quelque chose ne va pas avec le code

$h{$2}=~/ә$/ 

Il semble que lorsque J'utilise

$h{$2}!~/ә$/ 

Perl fera ce que je veux dire, mais pourquoi je ne peux pas obtenir "self-powering: selfpauәriŋ"? Qu'est-ce que je fais de mal? Des idées?

Merci comme toujours pour les commentaires/suggestions/pointeurs :)

+4

Je reçois rarement du code pour faire ce que je veux dire. *Soupir*. –

+0

Quel encodage de caractères utilisez-vous? UTF-8? Avez-vous lu http://perldoc.perl.org/utf8.html? – Boldewyn

+0

@Boldewyn, merci d'avoir laissé le commentaire. Mais ce problème a peu à voir avec l'encodage UTF-8. Le script est enregistré au format UTF-8 et peut sortir le contenu comme prévu sans aucun traitement de codage en script sur ma boîte Windows. – Mike

Répondre

6

Lorsque vous exécutez

$h{$2}!~/ә$/ 

Dans votre instruction if le contenu de 1 et 2 $ sont modifiés pour être vide, car aucun regroupement étaient apparié (il n'y en avait pas). Si vous le faites comme ceci:

if ($w =~ /(\w+)-(\w+)ing$/){ 
    my $m1 = $1; 
    my $m2 = $2; 
    if($m2~~%h && $m2~~%h && $h{$m2}=~/ә$/) { 
     $p = $h{$m1}.$h{$m2}.'riŋ'; 
     print "$w:"," [","$p","] "; 
    } 
} 

Je m'attends à ce que vous obteniez ce que vous voulez.

+0

@Sorpigal, donc le code doit soudainement se compliquer :(Mais, merci, merci, merci beaucoup, "le contenu de $ 1 et $ 2 sont changés pour être vide", c'est le noeud du problème :) J'ai été perplexe là depuis un certain temps. Maintenant, je vois ce que je faisais de mal. Merci! – Mike

1

Exécutez-vous avec use warnings activé? Cela vous dirait que $1 et $2 ne sont pas ce que vous attendez. Votre deuxième expression régulière, et non la première, détermine les valeurs de ces variables lorsque vous entrez dans le bloc if. Pour illustrer avec un exemple plus simple:

print $1, "\n" 
    if 'foo' =~ /(\w+)/ 
    and 'bar' =~ /(\w+)/; 
+0

@FM, le code est une version simplifiée d'un programme de jouet que j'ai codé qui a environ 300 lignes. J'avais une solution de contournement pour le problème que j'ai mentionné. Eh bien, je viens de vérifier le code, non, je n'ai pas activé l'avertissement, ah, c'est un autre problème. Merci pour le code d'illustration. Je me sens comme si j'étais éclairé :) – Mike

+1

Vous devriez toujours utiliser strict; et utiliser des avertissements; même dans le code 'jouet'. Lorsque vous corrigez toutes les erreurs et les avertissements, votre code sera meilleur. – Sorpigal

+1

@Mike: ce n'est pas la première fois que l'on vous conseille de toujours utiliser des avertissements stricts. S'il vous plaît commencer à tenir compte de ce conseil; vous serez beaucoup plus heureux et plus productif :) – Ether