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

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; 仍然不会用空格替换字符串。 该正则表达式匹配AGI[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 中不起作用?

为啥在 viewDidLoad 中添加子视图不起作用

我正在尝试从 .csv 读取信息并将其放入 C# 中的数组中。谁能告诉我为啥代码不起作用?

我试图总结给定数组中的数字,使用 recursion ,尝试了这段代码,但它不起作用。为啥?