【问题标题】:Why this code does not do what I mean?为什么这段代码不符合我的意思?
【发布时间】:2011-01-24 23:26:34
【问题描述】:
$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 会按照我的意思做,但为什么我不能获得“self-powering: selfpauәriŋ”? 我究竟做错了什么?有任何想法吗?

一如既往地感谢任何 cmets/建议/指针 :)

【问题讨论】:

  • 我很少得到任何代码来实现我的意思。 叹息
  • 你使用什么字符编码? UTF-8?你读过perldoc.perl.org/utf8.html 吗?
  • @Boldewyn,感谢您留下评论。但这个问题与 UTF-8 编码关系不大。该脚本保存为 UTF-8 格式,并且可以按预期输出内容,而无需在我的 Windows 机器上进行任何脚本内编码处理。
  • 好的,很好。只是想提一下大多数人开始在他们的 Perl 文件中放入非 ASCII 字符的陷阱。

标签: regex perl hash


【解决方案1】:

当你跑步时

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

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

【讨论】:

  • @Sorpigal,所以代码突然变得复杂了 :( 但是,谢谢,谢谢,非常感谢,“$1 和 $2 的内容被更改为空”,这是症结所在问题:) 我已经被难住了很长一段时间。现在我明白我做错了什么。谢谢!
【解决方案2】:

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

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

【讨论】:

  • @FM,代码是我编写的玩具程序的简化版本,大约有 300 行。对于我提到的问题,我有一个解决方法。嗯,我刚刚检查了代码,不,我没有启用警告,啊,那是另一个问题。感谢您的插图代码。我觉得我开悟了:)
  • 你应该总是使用 strict;并使用警告;即使在“玩具”代码中。当您修复所有错误和警告时,您的代码会更好。
  • @Mike:这不是您第一次被建议始终使用严格和警告。请开始注意这个建议;你会更快乐,更有效率:)
  • @Sorpigal 和@Ether,我会听取您对未来编码的建议。谢谢:)
猜你喜欢
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
相关资源
最近更新 更多