免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5912 | 回复: 8
打印 上一主题 下一主题

关于perl三目运算符的使用有个地方不懂 [复制链接]

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-12 16:24 |只看该作者 |倒序浏览
本帖最后由 54red 于 2015-11-12 16:25 编辑

今天写了一个程序发现三目运算符(?:)用的不对,请各位帮我看看我错在哪了!
$X="b";

$X eq "a"
? print "$X\n"
: $X eq "b"
   ? print "$X\n"
   : print "$X"."ne a||b";
运行结果:b
这个是对的!、


下面赋值就不对了!
$X eq "a"
? $X="aa"
: $X eq "b"
   ?$X="bb"
   :$X="cc";

print "X=$X\n";

结果输出的是X=cc

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2015-11-12 17:06 |只看该作者
本帖最后由 sunzhiguolu 于 2015-11-12 17:07 编辑

回复 1# 54red
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $sX = "a";
  5. $sX eq "a" ? $sX = "aa" : ($sX eq "b" ? $sX = "bb" : $sX = "cc");
  6. print "$sX\n";
复制代码

论坛徽章:
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
3 [报告]
发表于 2015-11-12 19:56 |只看该作者
优先级问题,?: 比 = 要高,所以成了
($X eq "a"
? $X="aa"
: $X eq "b"
   ?$X="bb"
   X)="cc";

个人觉得敢于用嵌套 ?: 的都是真的勇士

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
4 [报告]
发表于 2015-11-13 09:22 |只看该作者
多谢!这样结果肯定是对的!回复 2# sunzhiguolu


   

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
5 [报告]
发表于 2015-11-13 09:26 |只看该作者
多谢啊,这回知道错在哪了,不过还是想不太通,$X eq "a"? $X="aa": $X eq "b"? $X="bb": $X="cc";,是先执行的$X=cc,然后程序是怎么执行的,能详细解释一下不,绕不清楚啊!回复 3# zhlong8


   

论坛徽章:
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
6 [报告]
发表于 2015-11-13 10:00 |只看该作者
回复 5# 54red


    你看不到我括号家的哪里吗? = 'cc' 是最后执行的。 ($X eq "a"? $X="aa": $X eq "b"? $X="bb": $X )= 'cc';

这里 ?: 返回的是个左值,可以被赋值的,实际执行的是 ($X eq "a"? $X="aa": $X eq "b"? $X="bb": $X )= 'cc'; 连续两次赋值

评分

参与人数 1信誉积分 +10 收起 理由
54red + 10 很给力!

查看全部评分

论坛徽章:
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
7 [报告]
发表于 2015-11-13 10:02 |只看该作者
里面这么多赋值结果却是这么断句的,非常反直觉,所我说你是真勇士

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2015-11-13 10:51 |只看该作者
本帖最后由 jason680 于 2015-11-13 10:57 编辑

回复 5# 54red

这种错误使用方式,已经被列入perldoc说明...
   
$ perldoc perlop
NAME
    perlop - Perl operators and precedence

    ...


        left        terms and list operators (leftward)
        ...
        nonassoc    ..  ...
        right       ?:
        right       = += -= *= etc.
        ...

    Scalar or list context propagates downward into the 2nd or 3rd argument,
    whichever is selected.

        $a = $ok ? $b : $c;  # get a scalar
        @a = $ok ? @b : @c;  # get an array
        $a = $ok ? @b : @c;  # oops, that's just a count!

    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)

    That should probably be written more simply as:

        $a += ($a % 2) ? 10 : 2;


----------------------------
最后
写出编程是用来解决问题
还是乱写又产生更多问题


评分

参与人数 1信誉积分 +10 收起 理由
54red + 10 赞一个!

查看全部评分

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
9 [报告]
发表于 2015-11-13 13:49 |只看该作者
这回看清楚了! 回复 7# zhlong8


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP