2009-08-24 121 views

回答

24

首先,你为什么不是use ing strictwarnings?以下几行应该在您创建的每个Perl程序的顶部,位于#!/usr/bin/perl之后。 总是

use strict; 
use warnings; 

而且我知道你是不是因为我敢肯定你会得到一些不错的错误信息出来的从这个strictwarnings,并从代码中的其他许多地方为好,通过判断你的变量使用。

其次,你为什么不这样做:

for my $i (@pattern) { 
    .. 
} 

这通过每一个元素循环中@pattern,同时将其分配给$i之一。然后,在你的循环中,当你想要一个特定的元素时,只需使用$i。对$i所做的更改将反映在@pattern中,并且当循环退出时,$i将超出范围,基本上会自行清理。

三,拉里墙的爱,my声明变量来定位他们。我承诺,这真的不那么难,它使你成为一个更好的人。

第四,最后,你的数组将引用存储为散列值,而不是散列值。如果他们存储散列,则代码将会出错,因为散列以%开头,而不是$。实际上,参考(任何类型)都是标量值,因此从$开始。因此,我们需要提领他们获得哈希:

for my $i (@pattern) { 
    while(my($k, $v) = each %{$i}) { 
    debug(" $k: $v"); 
    } 
} 

或者,用自己的方式:

for (my $i = 0; $i<@pattern; $i++) { # added a my() for good measure 
    while(my($k, $v) = each %{$pattern[$i]}) { 
    debug(" $k: $v"); 
    } 
} 
+1

我爱你^^。是的,请使用“我的”... – 2009-08-24 07:35:25

+1

+1。 ;) – 2009-08-24 07:39:17

+0

哈哈,感谢您的回答,即使有很多需要阅读的信息:p我正在寻找的是%{$ i}(或%{$ _})来重新获得我的一些Perl荣誉)。 – Marius 2009-08-24 07:58:06

6

试试这个:

for my $hashref (@pattern) { 
    for my $key (keys %$hashref) { 
     debug "$key: $hashref->{$key}"; 
    } 
} 

并附上您尝试什么,最大的问题是each $pattern[$i]each函数需要一个散列来处理,但$pattern[$i]返回一个hashref(即对散列的引用)。您可以通过提领$pattern[$i]作为哈希解决您的代码:

while(my($k, $v) = each %{$pattern[$i]}) { 

另外,提防每一个功能,它可以leave the hash iterator in an incomplete state

+1

11打我秒。也许我应该漫不经心。 – 2009-08-24 07:30:19

+0

我尝试快速发布,然后回去漫步。 – 2009-08-24 07:36:50

+0

这是一个很好的策略。真的,我有很多东西要学。另外,关于为什么'each()'不好。我喜欢你的星球大战参考。 – 2009-08-24 07:45:46