好的,这是一个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}
获得不同的值。
我做错了什么(毫无疑问是显而易见的)?我看过关于每个人如何“脆弱”的评论 - 是吗?
答案 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};
...
}