我有一个关于使用“//”操作符的问题,我的测试代码如下:
perl -e '@arr1=();@arr2=(1,2,3);@arr3=defined(@arr1)?@arr1:@arr2;print "[@arr3]\n"' [1 2 3] perl -e '@arr1=();@arr2=(1,3);@arr3=@arr1//@arr2;print "[@arr3]\n"' [0] perl -e '$v1=();$v2="123";$v3=defined($v1)?$v1:$v2;print "[$v3]\n"' [123] perl -e '$v1=();$v2="123";$v3=$v1//$v2;print "[$v3]\n"' [123]
我的问题是,为什么使用“//”运算符与在标量上使用“defined()?:”相同的结果,而不是数组(或散列)?
谢谢!!!
解决方法
因为?的最左边的操作数,||或者&&& – 或这个newfanglulated // thingie – 总是在布尔不是列表上下文中进行求值,而其他操作数则会继承周围的上下文。
@a = @b && @c;
手段
if (@b) { @a = @c; } else { @a = scalar @b; }
而
@a = @b || @c;
并且
@a = @b // @c;
都意味着
手段
if (@b) { @a = scalar @b; } else { @a = @c; }
将@b分配给@a的唯一方法是使用?:
@a = @b ? @b : @c;
这当然意味着什么
if (@b) { @a = @b; } else { @a = @c; }
还有属性?:可以是一个左值:
(@a > @b ? @a : @b) = @c;
这当然意味着什么
if (@a > @b) { @a = @c; } else { @b = @c; }
编辑
@a // @b及其定义的实现有所不同。提交错误谢谢。