首先,请注意我出于好奇而问这个问题,我知道使用像@@
这样的变量名可能不是一个好主意。
使用双引号(或qq
运算符)时,会插入标量和数组:
$v = 5;
say "$v"; # prints: 5
$@ = 6;
say "$@"; # prints: 6
@a = (1,2);
say "@a"; # prints: 1 2
然而,使用@
+ 格式的数组名称<{1}},@@
,@!
,@,
,@%
等,数组未插值:
@;
所以这是我的问题:有谁知道为什么这些数组没有插值?是否记录在任何地方?
我找不到任何关于此的信息或文档。关于插值的基础知识,谷歌(或SO)上的文章/帖子太多了,所以答案可能只隐藏在其中一个,或者在第10页的结果中。
如果你想知道我为什么需要这样的变量名称:
@; = (1,2);
say "@;"; # prints nothing
say @; ; # prints: 1 2
(和-n
相关的)标志在代码末尾添加了分号-p
(我不确定它是否适用于每个版本的虽然perl)。因此,我可以通过改为;
来缩短此计划perl -nE 'push@a,1;say"@a"}{say@a'
,因为最后perl -nE 'push@;,1;say"@;"}{say@'
将;
转换为say@
。好吧,实际上我不能这样做因为say@;
没有用双引号插值。当然,它每天都没有用,但在一些高尔夫挑战中,为什么不呢!
模糊一些代码会很有用。 (混淆是否有用是另一个争论!)
答案 0 :(得分:17)
不幸的是我不能告诉你原因,但是这个限制来自toke.c
中的代码,可以追溯到perl 5.000(1994!)。我最好的猜测是,因为Perl没有使用任何内置的数组标点变量(除了@-
和@+
,在5.6(2000)中添加)。
如果以下字符为
,则S_scan_const
中的代码仅将@
解释为数组的开头
@x
,@_
,@1
)或:
(例如@::foo
)或'
(例如@'foo
(这是::
)的旧语法)或{
(例如@{foo}
)或$
(例如@$foo
)或+
或-
(数组@+
和@-
),但不在正则表达式中。如您所见,支持的唯一标点符号数组是@-
和@+
,即便不在正则表达式中。最初没有支持标点阵列; @-
和@+
在2000年是特殊的。(添加了正则表达式模式的例外以使/[\c@-\c_]/
起作用;它首先用于插入@-
。)
有一种解决方法:由于@{
被视为数组变量的开头,因此语法"@{;}"
有效(但这对您的高尔夫代码没有帮助,因为它会使代码更长) )。
答案 1 :(得分:6)
Perl的文档说,结果“不是严格可预测的”。
以下来自perldoc perlop
(Perl 5.22.1),指的是标量的插值。我认为它同样适用于数组。
还要注意插值代码需要做出决定 插值标量结束的地方。例如,是否
"a $x -> {c}"
确实意味着:"a " . $x . " -> {c}";
或:
"a " . $x -> {c};
大多数情况下,最长的文本不包括在内 组件之间的空间,包含匹配的大括号或 括号。因为结果可能是基于投票决定的 启发式估算器,结果不是严格可预测的。 幸运的是,对于模棱两可的案例,这通常是正确的。
答案 2 :(得分:3)
有些事情只是因为“拉里以这种方式编码”。或者像我以前在课堂上所说的那样,“它按照你想象的方式工作,只要你像Larry一样思考”,有时会加上“而且我的工作就是教你Larry的想法。”