在哈希元素中使用未初始化的值$ _

时间:2015-02-19 11:07:34

标签: perl hash compilation syntax-error element

这是关于运行Perl脚本时收到的警告消息。

我理解为什么我收到此警告:可能是因为$element在被叫时未定义但我看不到它。

for ( my $element->{$_}; @previous_company_names; ) {
    map { $element => $previous_company_names->{$_} }
            0 .. $previous_company_names;

结果就是这条消息

Use of uninitialized value $_ in hash element

1 个答案:

答案 0 :(得分:5)

首先,对于新程序员来说,绝对是你必须做的最重要的事情,use strict;use warnings;。你在那里得到了my,这表明你可能会这样,但重新加入它是值得的。

$_是一个特殊变量,称为隐式变量。在for循环中以这样的方式使用它并不是真的有意义。请查看perlvar以获取更多详细信息。

事实上,我建议完全转向map直到你真正理解它,因为这是一个让自己迷惑的好方法。

使用for(或foreach)循环,您可以:

for my $thing ( @list_of_things ) {
    print $thing;
 }

或者你可以这样做:

for ( @list_of_things ) {
   print $_;
}

$_由第二个循环的每次迭代隐式设置,这非常有用,因为很多东西都默认使用它。

E.g。

for ( @list_of_things ) {
   chomp; 
   s/ /_/g;
   print;
}

说到map - map是一个聪明的小函数,它允许您为列表中的每个元素计算代码块。就个人而言 - 我仍然对此感到困惑,并且大多数情况下倾向于坚持使用forforeach循环。

但是你用它做什么,并没有真正发挥作用 - map 使成为一个哈希。

类似于:

use Data::Dumper; 
my %things = map { $_ => 1 } 1..5; 
print Dumper \%things; 

这会创建哈希事物':

$VAR1 = {
          '1' => 1,
          '3' => 1,
          '5' => 1,
          '4' => 1,
          '2' => 1
        };

同样,$_在内部使用,因为它是神奇的变量 - 它设置为'无论在第二位' (例如1,2,3,4,5)每个循环,然后评估该块。

所以你的map表达并没有多大意义,因为你没有定义$element ......即使你做了,你也是如此。 d反复覆盖它。

我还要注意 - $previous_company_names需要是数字,并且与@previous_company_names无关。您可能想要使用$#previous_company_names这是最后一个元素索引。