免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1131 | 回复: 5

问个小白问题 [复制链接]

论坛徽章:
0
发表于 2012-09-12 10:24 |显示全部楼层
本帖最后由 sunkun_99 于 2012-09-12 10:25 编辑
  1. #! /usr/bin/perl
  2. use strict;

  3. my ($i, $conn_type) = (22, undef);
  4.      $i == 22   ? $conn_type = 'ssh'   
  5.    : $i == 23   ? $conn_type = 'telnet'
  6.    : $i == 3389 ? $conn_type = 'windows'   
  7.    :              $conn_type =  undef;       
  8.                        
  9. print "$conn_type\n";



  10. sub pri {
  11.     $conn_type = shift;
  12. }

  13.      $i == 22   ? &pri('ssh')   
  14.    : $i == 23   ? &pri('telnet')
  15.    : $i == 3389 ? &pri('window')   
  16.    :              &pri(undef);       

  17. print "$conn_type\n";
复制代码
输出结果为:
  1. [root@ilaus1-dev test]# a.pl

  2. ssh
  3. [root@ilaus1-dev test]#
复制代码
第一次输出结果为空,不知为何?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-12 11:12 |显示全部楼层
= 优先级比 ?: 低

The operator may be assigned to if both the 2nd and 3rd arguments are legal lvalues (meaning that you can assign to them):
    ($a_or_b ? $a : $b) = $c;
Because this operator produces an assignable result, using assignments without parentheses will get you in trouble. For example, this:
    $a % 2 ? $a += 10 : $a += 2
Really means this:
    (($a % 2) ? ($a += 10) : $a) += 2
Rather than this:
    ($a % 2) ? ($a += 10) : ($a += 2)

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-12 11:23 |显示全部楼层
等号优先级低所以化成了
( $i == 22   ? $conn_type = 'ssh'   
   : $i == 23   ? $conn_type = 'telnet'
   : $i == 3389 ? $conn_type = 'windows'   
   :              $conn_type) =  undef;  

这里变成了 ?: 结构做左值,所以要求 ?: 的第二第三个元素必须是左值,而且这两个左值的赋值必须都是 scalar assign 或 list assign

= 左边就是你原来理解的意思,实际执行的代码是 $conn_type = 'ssh' 而后 $conn_type = undef

这里明显用 given when 或者 hash 就可以了

论坛徽章:
0
发表于 2012-09-12 11:23 |显示全部楼层
本帖最后由 sunkun_99 于 2012-09-12 11:31 编辑

回复 2# zhlong8

也就是说因为i==22所以执行了$conn_type = 'ssh', 但是因为其必须是左值,但是这是个表达式,所以最后执行了默认的$conn_type,让其做左值?
   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-12 11:48 |显示全部楼层
本帖最后由 zhlong8 于 2012-09-12 11:48 编辑

回复 4# sunkun_99


(?:) = undef 这个结构要求第二三个元素是左值,否则编译都通不过。

实际执行了
($i == 22 ? $conn_type = 'ssh' : $any_lvalue_is_ok) = undef;

因为 $i == 22 为真,然后

($conn_type = 'ssh') = undef;

论坛徽章:
0
发表于 2012-09-12 13:12 |显示全部楼层
回复 6# zhlong8


    嗯,了解了。谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP