请帮助我理解“Programming Perl”一书中的片段

时间:2012-07-12 23:03:59

标签: perl perl-context

我读过By Tom Christiansen,Brian d foy,Larry Wall,Jon Orwant的“Programming Perl”。我没有理解以下文字(我不明白的确切地方标有粗体):

  

您真正想知道的是哪些运营商提供哪种环境   对他们的操作。碰巧,你可以很容易地分辨出哪些   供应清单上下文因为它们的语法都有LIST   描述即可。其他一切都提供标量背景。通常,   这很直观。如有必要,您可以强制标量上下文   使用scalar进入列表中间的参数   伪函数。 Perl无法在上下文中强制列表上下文,   因为在任何地方你都需要列表上下文它已经提供了   通过LIST 的某些控制功能。

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

  1. 该代码段中的列表是什么意思?

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

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

  4.   

    你可以强制标量上下文   到列表中间的参数

1 个答案:

答案 0 :(得分: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;

这可能是你的引用所指的内容。