好吧,这是一个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}的不同值。
我做错了什么(无疑是显而易见的)?我见过关于每个人都是“脆弱的”的评论--是这样吗?
发布于 2014-03-12 00:19:14
如果你已经有了你想要的“钥匙”,检查它是否存在并使用它.
此外,始终使用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发布于 2014-03-12 00:23:04
是的,如果您使用each来迭代一个散列,但是在没有返回结果之前不要一直迭代,那么您将在下一次停止的时候重新开始。
可以在循环之前使用键或值将内部迭代器重置为开头,如下所示:
keys(%project_keys);
while ( ($key, $value) = each %project_keys ) {尽管如此,你还有其他一些问题:
使用eq而不是==测试字符串相等性。
整个循环没有意义;您不需要遍历散列来查找值;只需执行以下操作即可替换该循环:
if ( exists $project_keys{$proj_code} ) {
$url = "http://projects/$project_keys{$proj_code}";
}发布于 2014-03-12 00:37:59
你在使用each。最好不要。它很微妙,并且在散列中存储状态。
远比
while( my ( $key, $value ) = each %hash ) {
...
}是在foreach函数上使用keys循环。
foreach my $key ( keys %hash ) {
my $value = $hash{$key};
...
}https://stackoverflow.com/questions/22339226
复制相似问题