在Perl中,有没有$ {foo [bar]}可能是语法上有效的代码?

时间:2012-03-12 02:00:28

标签: regex arrays perl

我正在阅读O'Reilly的Programming Perl,第3版,文中指出,不应使用模糊搜索模式/$foo[bar]/,而应使用/${foo[bar]}/,以便Perl不会出错[bar]用于字符类。我是否遗漏了某些内容,或者这两个语句在语法上是不正确的,因为它们试图使用裸字字符串索引到数组中?我已经在网上检查了这本书的勘误表,但在书中找不到任何关于这个错误的提法。是否存在一些我忽略的情况,即代码可能有效?

3 个答案:

答案 0 :(得分:8)

  

我正在阅读O'Reilly的 Programming Perl ,3 rd 版本,文中指出,不是使用含糊不清的搜索模式/$foo[bar]/,而是应该使用/${foo[bar]}/,以便Perl不会将[bar]误认为是一个字符类。我是否遗漏了某些内容,或者这些语句在语法上是不正确的,因为他们试图使用裸字字符串索引到数组中?

是的,你遗漏了一些东西:bar可以是一个函数调用:

$ perl -Mstrict -E 'sub bar() { 0 } say "foo" =~ /$ARGV[bar]/ || "FAIL"' foo
FAIL

$ perl -Mstrict -E 'sub bar() { 0 } say "foo" =~ /${ARGV[bar]}/ || "FAIL"' foo
1

$ perl -MO=Deparse -Mstrict -E 'sub bar() { 0 } say "foo" =~ /${ARGV[bar]}/ || "FAIL"' foo
sub bar () { 0 }
use strict 'refs';
BEGIN {
    $^H{'feature_unicode'} = q(1);
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
say 'foo' =~ /$ARGV[0]/ || 'FAIL';
-e syntax OK

来自Programming Perl, 4th edition第73页的确切引用是:

  

在搜索模式中,也进行双引号插值   是一个不幸的歧义:/$foo[bar]/被解释为/${foo}[bar]/   (其中[bar]是正则表达式的字符类)或/${foo[bar]}/   (其中[bar]是数组@foo的下标)?如果@foo不存在,那就是   显然是一个人物类。如果存在@foo,则Perl会对[bar]和{{1}}进行很好的猜测   几乎总是对的。如果猜错了,或者你只是偏执狂,   您可以使用大括号强制执行正确的解释,如前所示。即使   你只是谨慎,这可能不是一个坏主意。

答案 1 :(得分:4)

sub bar { 1 }
唉,我不能单独提交;它对于SO来说太短了。所以,这是在Perl中表达常量的一种方法。例如,sub MAGIC_NUMBER { 0x7774 }

答案 2 :(得分:0)

bar可能是一个功能:

perl -le 'sub bar () { 1 } my @foo = qw(hello world); print m/${foo[bar]}/ ? "$_ -> TRUE" : "$_ -> FALSE" for qw(hello world)'