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