为什么这段代码不符合我的意思?

时间:2010-03-08 13:02:48

标签: regex perl hash

$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","] "; 
}

我希望输出为

self-powering: selfpauәriŋ

但我得到的是:

self-powering: [riŋ]

我的猜测是代码错误

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

似乎在我使用时

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

Perl会做我的意思,但为什么我不能得到“自我动力:selfpauәriŋ”? 我究竟做错了什么?有任何想法吗?

一如既往地感谢任何意见/建议/指示:)

2 个答案:

答案 0 :(得分:6)

运行时

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

在你的if语句中,$ 1和$ 2的内容被更改为空,因为没有匹配的分组(没有分组)。如果你这样做:

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","] "; 
    }
}

我希望你会得到你想要的东西。

答案 1 :(得分:1)

您是否在启用use warnings的情况下运行?这会告诉您$1$2不是您所期望的。第二个正则表达式,而不是第一个,在您输入if块后确定这些变量的值。用一个更简单的例子说明:

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