您感到困惑是因为您认为=
是单个运算符,而它可能导致两个不同的运算符:列表赋值运算符或标量赋值运算符。迷你教程:标量与列表赋值运算符解释了差异。
my $b = (33,22,11);
------------------ Scalar assign in void context.
---------- List literal in scalar context. Returns last.
my @b = (33,22,11);
------------------ List assign in void context.
---------- List literal in list context. Returns all.
my $b = ( () = (33,22,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,22,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
将在列表上下文中调用,但整体将仅返回返回列表的一个元素。