我正在寻找用perl正则表达式/ e选项替代散列值。下面的代码不适合我。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
我怎样才能使这项工作?
感谢
我正在寻找用perl正则表达式/ e选项替代散列值。下面的代码不适合我。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
我怎样才能使这项工作?
感谢
s/^(name,(\d+).*)/$1,$hash{$2}/;
首先,括号是在的顺序编号左括号,不正确的括号。所以$1
是完整的行,$2
是数字,而不是相反。
其次,你不想在这里使用/e
。这会导致替换被评估为Perl代码而不是字符串,这意味着,
被视为comma operator而不仅仅是文本。在标量上下文中,逗号运算符评估两个操作数并返回第二个操作数,而这不是您想要的。如果你说过
use warnings;
Perl会告诉你“在void context中无用的变量”,因为第一个表达式被忽略。
你应该总是以你的程序:
use strict;
use warnings;
这两个行会帮助抓到很多的,你可能会使常见的错误。有时候你需要关闭部分代码,但是你应该先了解规则,然后才能决定什么时候打破它们。
如果你在这个程序中这样做,你需要在%hash
之前添加my。
总是包括'use strict;使用警告;'在你的代码中,明确写入'$ _'并不是一个好主意,因为各种函数都使用它作为临时值。 – Ether 2010-07-27 02:26:43