perl:“//”运算符

前端之家收集整理的这篇文章主要介绍了perl:“//”运算符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个关于使用“//”操作符的问题,我的测试代码如下:
  1. perl -e '@arr1=();@arr2=(1,2,3);@arr3=defined(@arr1)?@arr1:@arr2;print "[@arr3]\n"'
  2.  
  3. [1 2 3]
  4.  
  5. perl -e '@arr1=();@arr2=(1,3);@arr3=@arr1//@arr2;print "[@arr3]\n"'
  6.  
  7. [0]
  8.  
  9. perl -e '$v1=();$v2="123";$v3=defined($v1)?$v1:$v2;print "[$v3]\n"'
  10.  
  11. [123]
  12.  
  13. perl -e '$v1=();$v2="123";$v3=$v1//$v2;print "[$v3]\n"'
  14.  
  15. [123]

我的问题是,为什么使用“//”运算符与在标量上使用“defined()?:”相同的结果,而不是数组(或散列)?

谢谢!!!

解决方法

因为?的最左边的操作数,||或者&&& – 或这个newfanglulated // thingie – 总是在布尔不是列表上下文中进行求值,而其他操作数则会继承周围的上下文。
  1. @a = @b && @c;

手段

  1. if (@b) {
  2. @a = @c;
  3. } else {
  4. @a = scalar @b;
  5. }

  1. @a = @b || @c;

并且

  1. @a = @b // @c;

都意味着

手段

  1. if (@b) {
  2. @a = scalar @b;
  3. } else {
  4. @a = @c;
  5. }

将@b分配给@a的唯一方法是使用?:

  1. @a = @b ? @b : @c;

这当然意味着什么

  1. if (@b) {
  2. @a = @b;
  3. } else {
  4. @a = @c;
  5. }

还有属性?:可以是一个左值:

  1. (@a > @b ? @a : @b) = @c;

这当然意味着什么

  1. if (@a > @b) {
  2. @a = @c;
  3. } else {
  4. @b = @c;
  5. }

编辑

@a // @b及其定义的实现有所不同。提交错误谢谢。

猜你在找的Perl相关文章