【问题标题】: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'

标签: regex perl modifier


【解决方案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 代码的问题。

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2015-07-08
      • 2021-04-10
      • 2017-04-22
      • 2011-02-11
      相关资源
      最近更新 更多