perl正则表达式哈希与/ e

sfg*_*ups 0 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;
Run Code Online (Sandbox Code Playgroud)

我期待这样的输出:

name,3,cc
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

谢谢

cjm*_*cjm 8

s/^(name,(\d+).*)/$1,$hash{$2}/;
Run Code Online (Sandbox Code Playgroud)

首先,parens按左边的 paren 顺序编号,而不是右边的paren.$1完整的一行$2也是如此,而且是数字,而不是相反.

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

use warnings;
Run Code Online (Sandbox Code Playgroud)

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

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

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

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

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