我希望用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
我该如何做到这一点?
由于
答案 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。