perl正则表达式哈希与/ e

时间:2010-07-26 22:28:47

标签: regex perl

我希望用perl正则表达式/ e选项替换哈希值。以下代码对我不起作用。

 #!/usr/bin/perl

%hash=( 1 => "aa", 2 => "bb", 3 => "cc" );

$_="name,3";
s/^(name,(\d+).*)/$2,$hash{$1}/e;
print "$_\n";

exit 0;

我期待这样的输出:

name,3,cc

我该如何做到这一点?

由于

1 个答案:

答案 0 :(得分:8)

s/^(name,(\d+).*)/$1,$hash{$2}/;

首先,parens按照 left paren的顺序编号,而不是右边的paren。因此$1是完整的行,$2是数字,而不是相反。

其次,您不想在此处使用/e。这导致替换被评估为Perl代码而不仅仅是字符串,这意味着,被视为comma operator而不仅仅是文本。在标量上下文中,逗号运算符计算两个操作数并返回第二个操作数,这不是您想要的。如果你说过

use warnings;

Perl会告诉你“在void上下文中无用的变量”,因为第一个表达式被忽略了。

您应始终使用以下方式启动程序:

use strict;
use warnings;

这两行将有助于捕捉您可能犯的许多常见错误。有时您需要为代码的一部分关闭它们,但在决定何时可以破解它们之前,您应该先了解规则。

如果您在此计划中执行此操作,则需要在%hash之前添加my