我有一个函数,这取决于调用上下文,我想将此函数用作其他函数的参数。令人惊讶的是,我发现此second
函数现在在列表上下文中被调用。我尝试使用强制标量上下文,+()
但它没有按我预期的那样工作。因此,唯一的方法是使用隐式调用它scalar
。
use 5.010;
say first( 1, second( 'y' ) );
say first( 1, +( second( 'y' ) ) );
say first( 1, scalar second( 'y' ) );
sub first {
my $x = shift;
my $y = shift;
return "$x + $y";
}
sub second {
my $y = shift;
if ( wantarray ) {
qw/ array array /;
} else {
'scalar';
}
}
__END__
1 + array
1 + array
1 + scalar
函数的参数被视为列表,但这是否意味着该列表中的每个参数也都隐含了列表上下文?如果是,那为什么呢?
并且,使用scalar
作品,但是我还必须通过其他哪些方式在标量上下文中调用此函数(没有中间变量)?
为什么函数参数会引发列表上下文?
子例程接受数量可变的标量作为参数。还有什么其他选择?
函数的参数被视为列表,但这是否意味着该列表中的每个参数也都隐含了列表上下文?如果是,那为什么呢?
是的。因为您希望能够从哈希和数组的内容构建列表。有100万个原因如此有用。
%h = (%h, ...); # Add to a hash
f( $x, @opts ); # Composing argument lists
etc
使用
scalar
作品,但是我还必须在标量上下文中(没有中间变量)调用此函数的其他方式?
金田
say first( 1, "".second( 'y' ) ); # Side-effect: stringification
say first( 1, 0+.second( 'y' ) ); # Side-effect: numificatiion
say first( 1, !!second( 'y' ) ); # Side-effect: conversion to boolean
次常规原型也可以强制执行标量上下文,但是出于这个原因,通常认为它们是不好的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句