我正在尝试理解Perl的背景,我跳过了一个岩石;
给定代码;
#!/usr/bin/perl my $b = (33,22,11); print "$b\n"; my $b = () = (33,11); print "$b\n"; my @b = (33,11); print "@b\n"; my @b = () = (33,11); print "@b\n";
结果是(最后一行是空白);
11 3 33 22 11 <>
由于第二次打印返回了列表的长度,我假定在数组的某个地方生成数组,因为标量上下文中的数组可以计算出它的长度。但是,第四版印刷似乎相信这个假设。我期待看到’33 22 11’打印,但没有什么。这里发生了什么
解决方法
你感到困惑,因为你认为=是一个单一的运算符,而它可以导致两个不同的运算符:列表赋值运算符或标量赋值运算符。
Mini-Tutorial: Scalar vs List Assignment Operator解释了差异。
my $b = (33,11); ------------------ Scalar assign in void context. ---------- List literal in scalar context. Returns last. my @b = (33,11); ------------------ List assign in void context. ---------- List literal in list context. Returns all. my $b = ( () = (33,11) ); --------------------------- Scalar assign in void context. ------------------- List assign in scalar context. Returns count of RHS ---------- List literal in list context. Returns all. my @b = ( () = (33,11) ); --------------------------- List assign in void context. ------------------- List assign in list context. Returns LHS. ---------- List literal in list context. Returns all.
至于你的头衔,强制列表上下文是不可能的。如果一个函数返回一个列表,当一个标量是预期的,它会导致堆栈上的额外值,这导致操作符得到错误的参数。
但是,您可以执行以下操作:
( EXPR )[0]
要么
( EXPR )[-1]
EXPR将在列表上下文中调用,但整个返回只返回列表的一个元素。