这是关于我在运行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是一个聪明的小函数,它可以让您为列表中的每个元素计算代码块。就我个人而言,我仍然对此感到困惑,大多数时候我倾向于使用for
或foreach
循环。
但你用它做的事情并不会真正奏效——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
,这是最后一个元素索引。