$ 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?
感谢。
答案 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;
}