4

我阅读了 Tom Christiansen、brian d foy、Larry Wall、Jon Orwant 的“Programming Perl”。以下是我没看懂的文字(具体看不懂的地方用粗体标出):

您真正想知道的是哪些运算符为其操作数提供了哪些上下文。碰巧的是,您可以很容易地分辨出哪些提供列表上下文,因为它们的句法描述中都有 LIST。其他一切都提供标量上下文。一般来说,它非常直观。如有必要,您可以使用伪函数将标量上下文强制到 LIST 中间的参数上scalar 。Perl 没有提供在上下文中强制列表上下文的方法,因为在任何你想要列表上下文的地方,它已经由某些控制函数的 LIST 提供。

为方便起见,我想提出以下问题:

  1. 片段中的LIST是什么意思?

  2. 什么是句法描述?(似乎是某种文档)

  3. 下一段文字是什么意思:

您可以将标量上下文强制到 LIST 中间的参数上

4

1 回答 1

10

这很简单,就像文字所说的那样。看看perldoc -f print例如:

print FILEHANDLE LIST
print FILEHANDLE
print LIST

就像那里所说的那样,print采用 LIST 参数,这意味着之后发布的任何内容print都在列表上下文中。对于将参数表示为 LIST 的任何函数,它都是相同的。

使用该scalar函数,您可以覆盖此列表上下文,以便您的参数不在列表上下文中评估。例如,一个文件句柄 readline 语句,例如:

my $line = <$fh>;

在标量上下文中求值,因为$line是标量。这意味着只读取一行并将其放入变量中。但是,如果您要这样做:

print <$fh>;

readline 在列表上下文中,这意味着将读取文件中的所有剩余行。您可以通过将 readline 语句放在标量上下文中来覆盖它:

print scalar <$fh>;

然后你只会读一行。更准确地说,您可以在列表中间强制执行标量上下文:

print @list, scalar <$fh>, @list2;

这大概就是你的那句话中提到的。

于 2012-07-12T23:17:17.943 回答