如何在Perl字符串中转义类似代码的东西?

时间:2010-02-24 16:09:28

标签: perl printing heredoc

$ I = 1;     而($ i <3){         print&lt;&lt; “EOT”;         def px $ i = new E(用户)         if(!px $ i.hasErrors()){                 println“$ {px $ i.name} / $ {px $ i.empr.to} OK”         }

EOT

    $i++;
}

产生错误:

  

如果没有borrar.pl第3行的包或对象引用,则无法调用方法“px”。

如何“逃避”if?

感谢。

5 个答案:

答案 0 :(得分:6)

很难说这段代码应该完成什么,但也许你想让println语句中的外部美元符号保留在最终输出中?

println "\${px$i.name} / \${px$i.empr.to} OK"

有了这个改变,我看到的无错误输出是:

def px1 = new E(user) 
if (!px1.hasErrors()) {
        println "${px1.name} / ${px1.empr.to} OK"
}

def px2 = new E(user) 
if (!px2.hasErrors()) {
        println "${px2.name} / ${px2.empr.to} OK"
}

答案 1 :(得分:4)

命令行选项-MO=Deparse向您展示了Perl在简化代码后如何解释您的代码(例如,将heredocs转换为qq {}块)。 e.g。

$ perl -MO=Deparse test.pl
$i = 1;
while ($i < 3) {
    print qq[    def px$i = new E(user) \n    if (!px$i.hasErrors()) {\n            println "${$i->px . 'name';} / ${$i->px . 'empr' . 'to';} OK"\n    }\n\n];
    ++$i;
}

相关部分是:

println "${$i->px . 'name';} / ${$i->px . 'empr' . 'to';}

Perl已将${px$i.name}转换为${$i->px . 'name'}

在perl中,${...}表示评估块内的任何内容,并将其视为symbolic reference(即变量名称)或标量引用,然后取消引用它以将其转换为标量。因此,Perl尝试执行这些块中的任何内容,将其内容视为Perl代码。这是因为你的heredoc "EOT"就像一个双引号字符串,并插入美元符号。

解决方案是:逃避您的美元符号($ - &gt; \$)或使用单引号和连接而不是heredocs。

答案 2 :(得分:1)

这应解决问题。

println "${"px$i.name"} / ${"px$i.empr.to"} OK"
println "px$i.name" / px$i.empr.to OK"

答案 3 :(得分:1)

如您所见,字符串的$px部分正在评估中。你只需要逃避它:

$i=1;
while($i<3) {
    print << "EOT";
    def px$i = new E(user) 
    if (!px$i.hasErrors()) {
            println "\${px$i.name} / \${px$i.empr.to} OK"
    }

EOT

    $i++;
}

在“解析引用构造的Gory详细信息”下阅读有关perldoc perlop处字符串转义的详细信息。

答案 4 :(得分:1)

my $format = << 'EOT';
def px%d = new E(user)
    if (!px%d.hasErrors()) {
            println "${px%d.name} / ${px%d.empr.to} OK"
    }
EOT

for my $i ( 1 .. 3 ) {
    printf $format, ($i) x 4;
}