谁能解释为啥这段代码不起作用?
Posted
技术标签:
【中文标题】谁能解释为啥这段代码不起作用?【英文标题】:Can Anyone explain why this code does not work?谁能解释为什么这段代码不起作用? 【发布时间】:2021-02-27 07:37:14 【问题描述】:我正在尝试将一些变量替换为字符串。 哈希包含数据,$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";
【问题讨论】:
没关系...代码错误。$name =~ s/(%([AGM]))/($Sub$2)/eeg;
仍然不会用空格替换字符串。
该正则表达式匹配A
、G
、I
([AGI]
字符类)——不匹配M
...?
谢谢zdim。我抓到这么晚了。但是,第一个仍然不适用于包含空格的字符串。
现在写不出正确的答案... (1) 不需要ee
可能非常危险,这里甚至不需要e
(2)太多的括号...试试这个单行:perl -wE'$n = "#M #A (#G)"; say $n; %h = (M => "x", A => "y", G => "z"); $n =~ s/#([AGM])/#$h$1/g; say $n'
【参考方案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";
【讨论】:
【参考方案2】:s/.../($Sub$2)/eeg
是
的简写s/.../eval( ($Sub$2) )/eg # For each match,
# execute eval( ($Sub$2) )
# and use the value returned.
您实际上是在要求 Perl 编译和执行 $Sub$2
的值作为 Perl 代码,但 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 代码的问题。
【讨论】:
以上是关于谁能解释为啥这段代码不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
我不明白为啥这段代码不起作用 for int 错误 [重复]
为啥这个 javascript 字符串代码在 Internet Explorer 7 中不起作用?