微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试将一些变量替换为字符串。 散列包含数据,$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 代码的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。