为什么@@,@!,@等没有以字符串形式插入?

时间:2016-09-15 22:08:03

标签: perl

首先,请注意我出于好奇而问这个问题,我知道使用像@@这样的变量名可能不是一个好主意。

使用双引号(或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@;没有用双引号插值。当然,它每天都没有用,但在一些高尔夫挑战中,为什么不呢!

  • 模糊一些代码会很有用。 (混淆是否有用是另一个争论!)

3 个答案:

答案 0 :(得分:17)

不幸的是我不能告诉你原因,但是这个限制来自toke.c中的代码,可以追溯到perl 5.000(1994!)。我最好的猜测是,因为Perl没有使用任何内置的数组标点变量(除了@-@+,在5.6(2000)中添加)。

如果以下字符为

,则S_scan_const中的代码仅将@解释为数组的开头
  • 单词字符(例如@x@_@1)或
  • a :(例如@::foo)或
  • '(例如@'foo(这是::)的旧语法)或
  • a {(例如@{foo})或
  • a $(例如@$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的想法。”