问题描述
我正在尝试将一些变量替换为字符串。 散列包含数据,$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";
解决方法
您已将 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","\n====\n";
$name = "%M %A (%G).epub";
print "$name\n====\n";
$name =~ s/%([AGM])/$Sub{$1}/g; #<-- changed
print "$name\n====\n";
,
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 代码的问题。