免费注册 查看新帖 |

Chinaunix

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

仙子姐姐,请教问题,大家谁看到谁帮我解惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-27 15:07 |只看该作者 |倒序浏览
我在你讲map函数时候看到的

  1. #!/usr/bin/perl

  2. use Data::Dumper;

  3. foreach $num (1 .. 100) {
  4.    @expr = map { '$_ % ' . $_ . ' &&' } 2 .. int sqrt $num;
  5.    print Dumper @expr;
  6.    if (eval "grep { @expr 1 } $num") { print "$num " ; }
  7. }

  8. exit 0;
复制代码

我想问一下:if (eval "grep { @expr 1 } $num"
这个判断 eval "grep { @expr 1 } $num" 最后返回的是列表还是一个标量呢?

  1. 1 2 3 $VAR1 = '$_ % 2 &&';
  2. $VAR1 = '$_ % 2 &&';
  3. 5 $VAR1 = '$_ % 2 &&';
  4. $VAR1 = '$_ % 2 &&';
  5. 7 $VAR1 = '$_ % 2 &&';
  6. $VAR1 = '$_ % 2 &&';
  7. $VAR2 = '$_ % 3 &&';
  8. $VAR1 = '$_ % 2 &&';
  9. $VAR2 = '$_ % 3 &&';
复制代码

因为我看在{ @expr 1 }形成了很多表达式运算$_ % 2 && 1,然后通过grep匹配,那么grep之后返回什么呢?谢谢

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-10-27 17:01 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

grep返回array...
但是碰到if() 会转成纯量...表示array中的个数..
perl 的if =0的时候会当成false...

@array要看他放在哪儿.....
直接拿来用..会转成scalar @array;
如果放在"" 里面会打印出里面的数值...

perl里面很多这样的用法...有时候要看一下perldoc才比较清楚..

论坛徽章:
0
3 [报告]
发表于 2005-10-27 17:14 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

非常感谢非常感谢

因为对于100,他会从2除到10,则其中有能除尽的有不能除尽的,
在这个环境中grep出来的array中的具体内容是什么呢?


原帖由 "apile" 发表:
grep返回array...
但是碰到if() 会转成纯量...表示array中的个数..
perl 的if =0的时候会当成false...

@array要看他放在哪儿.....
直接拿来用..会转成scalar @array;
如果放在"" 里面会打印出里面的数值...
..........

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-10-27 17:25 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

他在求prime number...
所以你看到的data dump里面就是@expr的内容如下:
以97为例:
'$_ % 2 &&'
'$_ % 3 &&'
'$_ % 4 &&'
'$_ % 5 &&'
'$_ % 6 &&'
'$_ % 7 &&'
'$_ % 8 &&'
'$_ % 9 &&'


只有当$num为prime number时..上面所有的运算是都会为真...例如97..
坐上面所有的运算..最後 && 1都会为真...
所以grep返回的array..只有一个element 97....
应该是这样吧....

附带一提..仙子的例子...我觉得难度挺高的...
可能有点难理解...(我写不出那样的 code)..

论坛徽章:
0
5 [报告]
发表于 2005-10-27 17:42 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

OK,非常感谢

我新手,很难理解上去了

不过可以这样解释:
grep对列表里的每个元素进行BLOCK或EXPR匹配,它遍历列表,并临时设置元素为$_。在列表上下文里,grep返回匹配命中的所有元素,结果也是个列表。在标量上下文里,grep返回匹配命中的元素个数。

例如:
@files = grep { -f and -T } glob '* .*';
print "@files\n";
在{}中是BLOCK,并没有匹配什么,只说明通过这里之后都为真的返回,
这样理解之后,
以97为例:
'$_ % 2 &&'
'$_ % 3 &&'
'$_ % 4 &&'
'$_ % 5 &&'
'$_ % 6 &&'
'$_ % 7 &&'
'$_ % 8 &&'
'$_ % 9 &&'
那就是每一个操作都为真才可以返回,呵呵,我笨吧


原帖由 "apile" 发表:
他在求prime number...
所以你看到的data dump里面就是@expr的内容如下:
以97为例:
'$_ % 2 &&'
'$_ % 3 &&'
'$_ % 4 &&'
'$_ % 5 &&'
'$_ % 6 &&'
'$_ % 7 &&'
'$_ % 8 &&'
'$_ % 9 &&'


只..........

论坛徽章:
0
6 [报告]
发表于 2005-10-27 20:32 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

原帖由 "nihaogcd"]因为我看在{ @expr 1 }形成了很多表达式运算$_ % 2 && 1,然后通过grep匹配,那么grep之后返回什么呢?谢谢[/quote 发表:

  1. if (eval "grep { @expr 1 } $num") { print "$num " ; }
复制代码


偶也没看懂这句是怎么一回事,grep很少有这样的用法,

该script的作者说:
[quote]This works, but the code is such an evil mess that it made my dog cry. This code violates rule 1 from the classic work The Elements of Programming Style: Write clearly - don't be too clever.


还是不要学习这种生涩的expression好了

论坛徽章:
0
7 [报告]
发表于 2005-10-28 09:05 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

原帖由 "apile" 发表:


if (eval "grep { @expr 1 } $num" { print "$num " ; }
这一句..昨天下班回家的时候..突然懂了...
@expr 1 其实就是等於
$_ % 2 && $_ % 3 && $_ % 4 && 1
看懂了吗?
因为 {} 等同 ""..所以@expr会自动..........


是哦,     

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2005-10-28 10:22 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

我也来卖弄卖弄
  1. #!/usr/bin/perl

  2. $" = ' && ';
  3. foreach $num (1 .. 100) {
  4.   @expr = map { "$num % $_" } ( 2 .. int sqrt $num );
  5.   push @expr, '1';
  6.   if ( eval "@expr" ) { print "$num " ; }
  7. }

  8. exit 0;
复制代码

论坛徽章:
0
9 [报告]
发表于 2005-10-28 12:14 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

Perl ,大哥,你玩我

论坛徽章:
0
10 [报告]
发表于 2005-10-29 08:36 |只看该作者

仙子姐姐,请教问题,大家谁看到谁帮我解惑

偶总结下Apile和flw说的:

"grep { @expr 1 } $num"

eval里的这一串,由于位于双引号里,变量都被内插了。

@expr本来是这样的:('$_ % 2 &&', '$_ % 3 &&', '$_ % 4 &&')
内插后变成一个字符串:$_ % 2 && $_ % 3 && $_ % 4 &&

然后这个字符串加上最后一位1:$_ % 2 && $_ % 3 && $_ % 4 && 1

其实最后的&& 1是多余的,因为条件表达式里,.. && 1就等同于..
这里加上1是为了最后那个&&不多余。

作者之所以这么做,可能是早版本的perl里没有join函数,所以就取这个巧了。

$_ % 2 && $_ % 3 && $_ % 4 && 1这串本来也没什么意义,但它作为grep的表达式就有意义了。grep的input这里就是一个数字$num,grep在表达式里计算时,会临时把$_设置为这个数字$num。这一串取余运算(%)下去,如果没有余数,其中某项就会返回0,由于整个串用&&(and)连起来,其中一项为0,那么整个表达式就是false了。

所以lz问的问题就有答案了,grep这里返回的结果只有2种:1或0。返回1的话,表示全部可以取余,它就是质数啦。返回0的话,说明至少有1项没有余数,故它非质数了。

关键是要理解变量内插,上述就容易看懂了,:p
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP