2010-07-26 46 views
0

我正在寻找用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 

我怎样才能使这项工作?

感谢

+0

总是包括'use strict;使用警告;'在你的代码中,明确写入'$ _'并不是一个好主意,因为各种函数都使用它作为临时值。 – Ether 2010-07-27 02:26:43

回答

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

首先,括号是在的顺序编号左括号,不正确的括号。所以$1是完整的行,$2是数字,而不是相反。

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

use warnings; 

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

你应该总是以你的程序:

use strict; 
use warnings; 

这两个行会帮助抓到很多的,你可能会使常见的错误。有时候你需要关闭部分代码,但是你应该先了解规则,然后才能决定什么时候打破它们。

如果你在这个程序中这样做,你需要在%hash之前添加my

+0

你能告诉我在哪里可以找到/ e的解释吗?我谷歌了一会儿,没有发现任何有用的东西。 – zdd 2013-06-19 07:36:37

+1

@zdd,它记录在它适用的['s/PATTERN/REPLACEMENT /'运营商](http://perldoc.perl.org/perlop.html#s/PATTERN/REPLACEMENT/msixpodualgcer)下。 – cjm 2013-06-19 14:22:44

+0

非常感谢你! – zdd 2013-06-20 03:34:38