perl:“//&引用;操作人员
我有一个关于使用“/”运算符的问题,我的测试代码如下:perl:“//&引用;操作人员,perl,Perl,我有一个关于使用“/”运算符的问题,我的测试代码如下: perl -e '@arr1=();@arr2=(1,2,3);@arr3=defined(@arr1)?@arr1:@arr2;print "[@arr3]\n"' [1 2 3] perl -e '@arr1=();@arr2=(1,2,3);@arr3=@arr1//@arr2;print "[@arr3]\n"' [0] perl -e '$v1=();$v2="123";$v3=defined($v1)?$v1:$
perl -e '@arr1=();@arr2=(1,2,3);@arr3=defined(@arr1)?@arr1:@arr2;print "[@arr3]\n"'
[1 2 3]
perl -e '@arr1=();@arr2=(1,2,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()?:”相同的结果
谢谢 这与定义的
有关,而与/
有关。发件人:
不推荐在聚合(哈希和数组)上使用定义的。
它用于报告是否为该聚合分配了内存。这种行为可能会在未来的Perl版本中消失
因此,在第一个示例中,定义(@arr1)
为false;在第二种情况下,定义(@arr1)
为true,@arr3
包含标量(@arr1)
。定义的/
和之间的区别($a)$a:$b
在以下内容中注明:
尽管Perl的/
操作符在C中没有直接的等价物,但它与C风格的或相关。事实上,它与| |
完全相同,只是它测试左手边的定义性,而不是它的真实性。因此,$a/$b
类似于定义的($a)|$b
(只是它返回$a
的值,而不是定义的($a)
)的值),并产生与定义的($a)相同的结果$a:$b
(除了三元运算符形式可以用作左值,而$a//$b
不能)。这对于为变量提供默认值非常有用。如果您确实想测试是否至少定义了$a
和$b
中的一个,请使用已定义($a/$b)
(我的重点。)
例如:
(defined($a) ? $a : $b) = $c; # This is valid.
($a // $b) = $c; # This is not.
因为?:
、|
或&&&
-或这个新出现的/
thingie-的最左边的操作数总是在布尔非列表上下文中计算,而其他操作数继承周围的上下文
@a = @b && @c;
意味着
当
而且
都是指
意味着
在将@b
赋值给@a
时,摆脱标量的唯一方法是使用?:
@a = @b ? @b : @c;
这当然意味着
if (@b) {
@a = @b;
} else {
@a = @c;
}
if (@a > @b) {
@a = @c;
} else {
@b = @c;
}
还有一个属性,?:
可以是左值:
(@a > @b ? @a : @b) = @c;
这当然意味着
if (@b) {
@a = @b;
} else {
@a = @c;
}
if (@a > @b) {
@a = @c;
} else {
@b = @c;
}
编辑
@a//@b
的实现及其定义不同。错误提交。谢谢。谢谢您的快速回复!是的,我以前在perlop上注意到了这一点,但仍然感到困惑,您能解释一下吗,因为我是一个新的perl学习者,再次感谢!!我不确定它是否适用,因为表单是在作业的右侧使用的,而不是左值。谢谢你的回答。你能演示一下这个代码是如何工作的吗?@a=@b/@c
看起来“/”与“||”不一样,请参阅:perl-e'@arr1=()@arr2=(1,2,3)@arr3=@arr1/@arr2;打印“[@arr3]\n”
和perl-e'@arr1=()@arr2=(1,2,3)@arr3=@arr1 | |@arr2;打印“[@arr3]\n”
在数组上定义的调用本身未定义。天哪,你说得对,这里有点古怪。除此之外,它是否是一个全局的(@arry)
是否定义了(@arry)
警告你也很重要<代码>perl-e'@arr1=()@arr2=(1,2,3);if(@arr1){@arr3=scalar@arr1}else{@arr3=@arr2};打印“[@arr3]\n”[1 2 3]perl-e'@arr1=()@arr2=(1,2,3)@arr3=@arr1/@arr2;打印“[@arr3]\n”[0]
@ss perl:我现在确定您在定义和实现/
运算符的过程中发现了一个合法的错误。
(@a > @b ? @a : @b) = @c;
if (@a > @b) {
@a = @c;
} else {
@b = @c;
}