什么是 Perl 中的 @.?

6

什么是perl中的@.变量?

它似乎是一个特殊的,可写的全局变量,并且(出乎意料地)不会在双引号字符串中插值:

use strict;
use warnings;

                 # Under 5.8, 5.10, 5.12, 5.14, and 5.16,
                 # the following lines produce:

@. = (3, 2, 1);  # no error
print "@.\n";    # "@."
print @., "\n";  # "321"

eval 'my @.; 1'  # Can't use global @. in "my" at (eval 1)
  or die $@;     #  line 1, near "my @."

我之前不记得遇到过它,并且在perlvarperldata中也没有看到它。


这种缺乏插值的情况非常不对。已经提交了一个错误报告 - ikegami
@ikegami:这种行为是未记录的,所以并不算错,更不用说“非常错误”了。编程语言是供人们使用的工具:如果你能找到一个因此异常行为而受到不便的程序员,那我向你致敬。 - Borodin
@Borodin,插值已经有很好的文档说明了,这与文档直接相矛盾。你在说什么? - ikegami
2个回答

6

perldoc perlvar指出:

Perl变量名也可以是数字序列或单个标点符号或控制字符。这些名称都被Perl保留用于特殊用途;

并且

以数字、控制字符或标点符号开头的Perl标识符不受包声明影响,始终被强制为package main;它们也不受strict 'vars'错误的影响。

您正在使用保留名称。您不应该期望能够依赖任何功能。


你知道为什么它不进行插值吗? - pilcrow
这是Perl语言中的保留字。没有理由期望它以特定的方式运行。 - Sinan Ünür
1
据推测,当 perl 处理 "@." 时,它会检查 @. 是否是具有特殊意义的变量之一。如果不是,它可能会认为您没有想要进行插值。我不确定需要什么样的魔法才能使其被解释为不同的方式,但我不想冒险尝试。 - Sinan Ünür
1
谢谢。就我个人而言,我认为在这里进行更改会破坏很多处理字符串表示形式的代码(用于匹配电子邮件地址的(naive)正则表达式),这也是我第一次看到它并错误地认为“哦,这将插值为空。” - pilcrow
很可能是因为这个原因,Perl 5的移植者使其免受插值的影响。但所有这些都是猜测,任何未被记录的内容都是未定义的。 - Borodin

4

$.表示最近处理的文件句柄的当前行号(或记录编号)。

@.没有特殊的含义或用途。


"@."不进行插值,但"@{.}"会进行插值。

@.保留用于将来使用,不应该使用。


是的。那么这是否实际上也声明了 %. 等呢?为什么 @. 不插值? - pilcrow
@pilcrow - %~ 也可以用作哈希表:%~ = qw(1 2); print "$~{1}\n"; 将打印出 2 - Ωmega
2
@. 插值,但你必须写成 "@{.}" - Denis Ibaev
有趣的是,在5.6.1中,@-和@+未插值。 - ikegami
@ikegami - 你要挖掘那么久远的历史吗?5.6.1中的@{-}@{+}怎么样? - Ωmega
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接