我是否需要重置Perl哈希索引?

时间:2014-03-11 23:56:33

标签: perl hash

好的,这是一个N00b问题,但它让我感到难过:

我有以下Perl代码:

%project_keys = (
  cd     => "continuous_delivery",
  cm     => "customer_management",
  dem    => "demand",
  dis    => "dis",
  do     => "devops",
  sel    => "selection",
  seo    => "seo"
);

print "proj_code is $proj_code\n";
while ( ($key, $value) = each %project_keys ) {
    if ($key == $proj_code) {
        $url = "http://projects/".$project_keys{$key}."/setter";
        last;
    }
}

$proj_code始终在同一('dis')中传递,并且打印行显示该内容。

但是,每次运行时,我都会为project_keys{$key}获得不同的值。

我做错了什么(毫无疑问是显而易见的)?我看过关于每个人如何“脆弱”的评论 - 是吗?

3 个答案:

答案 0 :(得分:6)

如果您已经拥有了预期的“密钥”,请检查它是否存在并使用它......

另外,请始终使用use strict; use warnings;

#!/usr/bin/perl

use strict;
use warnings;

my $proj_code= 'dis';
my $url;

my %project_keys = (
  cd     => "continuous_delivery",
  cm     => "customer_management",
  dem    => "demand",
  dis    => "dis",
  do     => "devops",
  sel    => "selection",
  seo    => "seo"
);

$url = "http://projects/$project_keys{$proj_code}/setter" 
    if exists $project_keys{$proj_code};

print "url: $url\n";

输出:

url: http://projects/dis/setter

答案 1 :(得分:3)

是的,如果你使用each迭代一个哈希但是没有一直迭代直到没有返回结果,你将在下次离开的时候拿起。

您可以在循环之前使用键或值将内部迭代器重置为开头,如下所示:

keys(%project_keys);
while ( ($key, $value) = each %project_keys ) {

那就是说,你还有其他一些问题:

使用eq而非==来测试字符串相等性。

你的整个循环毫无意义;你不需要需要遍历一个哈希来查找一个值;只需执行以下操作即可替换循环:

if ( exists $project_keys{$proj_code} ) {
    $url = "http://projects/$project_keys{$proj_code}";
}

答案 2 :(得分:0)

您正在使用each。最好不要。它很微妙,并将状态存储在哈希中。

远胜于

while( my ( $key, $value ) = each %hash ) {
   ...
}

是在foreach函数

上使用keys循环
foreach my $key ( keys %hash ) {
   my $value = $hash{$key};
   ...
}