谁能解释为什么这段代码不起作用?

时间:2021-02-27 07:37:14

标签: regex perl modifier

我正在尝试将一些变量替换为字符串。 散列包含数据,$name 字符串是格式。 它将放入两个变量而不是 %M 一个。 我很困惑。我尝试了两种不同的信号字符,而且 有空格和没有空格的替代品。 %M 不进去。????

use Data::Dumper;

my %Sub = (A=>'Alan',G=>'42', M=>"Memories of Japan");
print "\%Sub=\n".Dumper(%Sub)."\n====\n";

my $name = "#M #A (#G).epub";
print "$name\n====\n";
$name =~ s/(#([AGM]))/($Sub{$2})/eeg;
print "$name\n====\n";

%Sub = (A=>'Bob',G=>'13', M=>'NightHawk');
print "\%Sub=\n".Dumper(%Sub)."\n====\n";
$name = "%M %A (%G).epub";
print "$name\n====\n";
$name =~ s/(%([AGM]))/($Sub{$2})/eeg;
print "$name\n====\n";

2 个答案:

答案 0 :(得分:1)

您已将 regexpr 中的“e”修饰符加倍。另外,在这个例子中你可以删除它:

use strict;
use warnings;
use Data::Dumper;

my %Sub = (A=>'Alan',G=>'42', M=>"Memories of Japan");
print "\%Sub=\n", Dumper(%Sub), "\n====\n";

my $name = "#M #A (#G).epub";
print "$name\n====\n";
$name =~ s/#([AGM])/$Sub{$1}/g;   #<-- changed
print "$name\n====\n";

%Sub = (A=>'Bob',G=>'13', M=>'NightHawk');
print "\%Sub=\n", Dumper(%Sub), "\n====\n";
$name = "%M %A (%G).epub";
print "$name\n====\n";
$name =~ s/%([AGM])/$Sub{$1}/g;   #<-- changed
print "$name\n====\n";

答案 1 :(得分:1)

s/.../($Sub{$2})/eeg

的简写
s/.../eval( ($Sub{$2}) )/eg    # For each match,
                               # execute eval( ($Sub{$2}) )
                               # and use the value returned.

您实际上是在要求 Perl 作为 Perl 代码编译和执行 $Sub{$2} 的值,但 Memories of Japan 不是(通常)有效的 Perl 代码。

你想要

s/.../$Sub{$2}/eg              # For each match,
                               # execute $Sub{$2}
                               # and use the value returned.

甚至

s/.../$Sub{$2}/g               # For each match,
                               # execute qq/$Sub{$2}/
                               # (equivalent to "$Sub{$2}")
                               # and use the value returned.

请注意,您应该始终使用 use strict; use warnings;。它会遇到将 NightHawk 视为 Perl 代码的问题。