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;
}