免费注册 查看新帖 |

Chinaunix

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

Perl中“条件表达式”能够传递么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-14 11:03 |只看该作者 |倒序浏览
Perl中“条件表达式”能够传递么?

用一个例子描述下我的问题
有三个整数$i, $j, $k,
有多个条件,如:
条件1:0 <= $j - $i <= 2;
条件2:0 <= $k - $j <= 2;
条件3:1 <= $k - $i <= 3;
条件4:($i + $j +$k)%3 = 1;

有一个数组@a;

依次判断条件1~4,如果满足,向@a压入数据1,如果不满足,压入0 。
于是有如下程序:
if($j-$i >= 0 && $j-$i <= 2) {push @a, 1;}   else { push @a, 0;}
if($k-$j >= 0 && $k-$j <= 2) {push @a, 1;}   else { push @a, 0;}
if($k-$i >= 1 && $k-$i <= 3) {push @a, 1;}   else { push @a, 0;}
if( ($i+$j+$k)%3 = 1)            {push @a, 1;}   else { push @a, 0;}

可以看到,上面的程序除了条件表达式不同,其余部分都相同,
大量的重复代码简直是坑爹,应该可以用一个循环或子程序来实现。
比如写一个子程序:
sub judge{
     my $condition = shift @_ ;
     if($condition代表的条件表达式为真){push @a, 1} else {push @a,0}
}

&judge(条件表达式1  );
&judge(条件表达式2  );
&judge(条件表达式3  );
&judge(条件表达式4  );

或者将条件表达式作为一个数组的元素,遍历这个数组。

但这时有一个问题:
条件表达式如何才能传递到子程序中,然后在子程序中对之再进行判断;
条件表达式如何才能作为数组的元素,然后在遍历数组时对之再进行判断?

以我的水平,传递之后,条件表达式,就变成了一个字符串或一个引用了,
我没有办法再对之进行判断。

请问大家有什么办法没?
或者不传递条件表达式,用其它的方法实现,
目的是不要重复地写if( (条件表达式) {push @a, 1;}   else { push @a, 0;}

啰嗦了这么多,不知说清楚没。
谢谢各位大侠。

论坛徽章:
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
2 [报告]
发表于 2011-10-14 11:13 |只看该作者
脑袋短路了

论坛徽章:
0
3 [报告]
发表于 2011-10-14 11:46 |只看该作者
传递参数,在子程序内部判断,输出数组引用。

论坛徽章:
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
4 [报告]
发表于 2011-10-14 12:00 |只看该作者
回复 1# shangtian2007

1. sub judge
   only return 1 or 0.

2.
push @a, &judge(条件表达式1  );
push @a, &judge(条件表达式2  );
push @a, &judge(条件表达式3  );
push @a, &judge(条件表达式4  );

论坛徽章:
0
5 [报告]
发表于 2011-10-14 12:27 |只看该作者
push @a, (0=>1)[@{[$j-$i >= 0 && $j-$i <= 2]}]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2011-10-15 00:56 |只看该作者
本帖最后由 rubyish 于 2011-10-15 01:21 编辑

用其它的方法实现:
只要一行代码:
  1. my ( $a, $b, $c ) = ( 1, 2, 3 );
  2. map { $_ ||= 0 } my @a = ( ( $a > $b ), ( $a > $c ), ( $c > $a ) );
复制代码
  1. print @a;
  2. 001
复制代码

论坛徽章:
1
狮子座
日期:2013-11-13 22:28:35
7 [报告]
发表于 2011-10-15 23:28 |只看该作者
6楼的很赞啊

论坛徽章:
0
8 [报告]
发表于 2011-10-24 19:56 |只看该作者
回复 5# Kitaisky


    push @a, (0=>1)[@{[$j-$i >= 0 && $j-$i <= 2]}]

太高级了,能不能解释下?
1. [$j-$i >= 0 && $j-$i <= 2]         是一个引用?还是进行条件判断?中括号什么作用?
2. @{[$j-$i >= 0 && $j-$i <= 2]}  是一个数组么?如果是,它的元素是什么?
3. [@{[$j-$i >= 0 && $j-$i <= 2]}] 最外层的中括号与(1)中用的中括号作用一样么?
4. (0=>1)的作用是什么?当后面的中括号返回这真,得到1,返回为假,得到0?如果写成(5=>6),是不是为真返回6,为假返回5?

非常感谢您的回答。

论坛徽章:
0
9 [报告]
发表于 2011-10-24 20:04 |只看该作者
回复 6# rubyish


    map { $_ ||= 0 } my @a = ( ( $a > $b ), ( $a > $c ), ( $c > $a ) );

看不太懂,有3点疑问:
1. ($a > $b),这种写法,是不是,当条件成立时,得到1,不成立时,返回0(或者返回的是undef?)?
2.  {$_ ||=0},意思是不是:当$_为1时,将 $_ 映射为 1,当 $_ 为假(还是undef)时 映射为 0?
3. 试了一下,如果 “||”和“=”之间有空格,将会出错,那 || 就不是短路操作符“或”了,那它又是什么?

非常感谢您的回答。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
10 [报告]
发表于 2011-10-25 09:51 |只看该作者
回复 9# shangtian2007
  1. $a += 1;
  2. $a = $a + 1;

  3. $_ ||= 0;
  4. $_ = $_ || 0;
复制代码
如果你喜欢push
  1. my ( $a, $b, $c ) = ( 1, 2, 3 );
  2. my @a = ( ( $a > $b ), ( $a > $c ), ( $c > $a ) );
  3. my @b;
  4. push @b, $_ ? 1 : 0 for @a;
复制代码
  1. print @b;
  2. 001
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP