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

0 perl hash element compilation syntax-error

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

我理解为什么我收到这个警告:可能是因为$element在被叫时未定义但是我没有看到它.

for ( my $element->{$_}; @previous_company_names; ) {
    map { $element => $previous_company_names->{$_} }
            0 .. $previous_company_names;
Run Code Online (Sandbox Code Playgroud)

结果是这条消息

Use of uninitialized value $_ in hash element
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 5

首先 - 对于一个新的程序员来说,绝对是你必须做的最重要的事情,就是use strict;use warnings;.你已经进入my了那里,这表明你可能会这样做,但重新进行迭代是值得的.

$_是一个特殊变量,称为隐式变量.在for循环中以这样的方式使用它并没有多大意义.看看perlvar更多细节.

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

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

for my $thing ( @list_of_things ) {
    print $thing;
 }
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

for ( @list_of_things ) {
   print $_;
}
Run Code Online (Sandbox Code Playgroud)

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

例如

for ( @list_of_things ) {
   chomp; 
   s/ /_/g;
   print;
}
Run Code Online (Sandbox Code Playgroud)

当涉及到map- map是一个聪明的小函数时,它允许您为列表中的每个元素计算代码块.就个人而言 - 我仍然对它感到困惑,而且大多数时候都倾向于坚持forforeach循环.

但是你正在做的事情并没有真正发挥作用 - map 一个哈希.

所以类似于:

use Data::Dumper; 
my %things = map { $_ => 1 } 1..5; 
print Dumper \%things; 
Run Code Online (Sandbox Code Playgroud)

这会创建哈希"事物":

$VAR1 = {
          '1' => 1,
          '3' => 1,
          '5' => 1,
          '4' => 1,
          '2' => 1
        };
Run Code Online (Sandbox Code Playgroud)

再次,$_在内部使用,因为它是魔术变量 - 它被设置为'每个循环中的任何内容'(例如1,2,3,4,5),然后评估该块.

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

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