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



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

我理解为什么我会收到这个警告:可能是因为$element在被调用时未定义,但我看不到它。

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

结果是这个消息

Use of uninitialized value $_ in hash element

首先,对于一个新程序员来说,你必须做的最重要的事情就是use strict;use warnings;。你有my,这表明你可能有,但重新迭代它是值得的。

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

事实上,我建议你完全避开map,直到你真正理解它,因为这是一个混淆自己的好方法。

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

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

或者你可以做:

for ( @list_of_things ) {
   print $_;
}

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

例如

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。。。即使你这样做了,你也会反复覆盖它。

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

最新更新