Chinaunix

标题: 给大家贴个我写错的代码 [打印本页]

作者: zhlong8    时间: 2012-09-21 10:24
标题: 给大家贴个我写错的代码
  1. sub t {
  2.     return {'a' .. 'z'}
  3. }

  4. while (my($k, $v) = each %{t()}) {
  5.     print "$k => $v\n";
  6. }
复制代码

作者: yybmsrs    时间: 2012-09-21 10:46
死循环了
作者: Perl_Er    时间: 2012-09-21 11:03
回复 1# zhlong8


    每次调用t()永远返回第一对
作者: sjdy521    时间: 2012-09-21 11:42
本帖最后由 sjdy521 于 2012-09-21 11:43 编辑

每个hash的迭代器都是独立的,这种错误确实不容易及时发现
作者: zhlong8    时间: 2012-09-21 11:51
我觉得是这个模式用得太多了潜意识中把 while (($k,$v) = each %hash) {} 当成一种语法,或者说当成迭代器了。比如 ruby 里的 t().each {|k, v| ... }
作者: illidanee    时间: 2012-09-21 13:09
谢谢提醒,以后要多注意了。
作者: zhlong8    时间: 2012-09-21 13:59
举一反三下 t() 可以返回任意不同的 hash 引用,所以可以随时切换到另一个 hash 去循环
作者: 7looki    时间: 2012-09-21 15:21
本帖最后由 7looki 于 2012-09-21 15:30 编辑

回复 1# zhlong8


     贴个each比较有趣的地方:
  1. use strict;
  2. use warnings;
  3. use 5.014;

  4. my @z = qw/a b c/;

  5. foreach ( 6..8 ) {    ## 你也可以改为 4..6, 8..10, 结果都一样
  6.     my ( $x,$y ) = each @z;
  7.     print "$x : $y\n";
  8. }
复制代码
  1. use strict;
  2. use warnings;
  3. use 5.014;

  4. my %z = ( 'a', 'A', 'b', 'B', 'c', 'C' );

  5. foreach ( 6..8 ) {    ## 你也可以改为 4..6, 8..10, 结果还是一样
  6.     my ( $x,$y ) = each %z;
  7.     print "$x : $y\n";
  8. }
复制代码
搞不清原理,不知道 Perl 内部是怎么运作的, 但结果肯定是正确的.
作者: yybmsrs    时间: 2012-09-21 15:53
回复 8# 7looki


    第一个应该是5.14的新用法,我在5.10上都用不了。

               When called in list context, returns a 2-element list
               consisting of the key and value for the next element of a hash,
               or the index and value for the next element of an array, so
               that you can iterate over it.  When called in scalar context,
               returns only the key (not the value) in a hash, or the index in
               an array.


作者: ttcn_cu    时间: 2012-09-21 16:43
    while (my($k, $v) = each %{{'a'..'z'}}) {
        print "$k => $v\n";
    }

作者: cdtits    时间: 2012-09-21 20:19
当以警戒自己代码




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2