perl - 在散列元素中使用未初始化的值 $_

标签 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

最佳答案

首先也是最重要的——对于一个新程序员来说,你必须做的最重要的事情是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),然后对 block 进行评估。

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

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

关于perl - 在散列元素中使用未初始化的值 $_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28604754/

相关文章:

perl - IO::Socket::SSL 在 IIS 8.5 中失败

linux - 从 Perl 在 (Ubuntu) Linux 上启动一个独立的 Selenium RC 服务器

ruby - 为什么我的代码在使用哈希符号而不是哈希字符串时会崩溃?

ruby-on-rails - Rails - 如何通过回调保存字段值(使用记录的 ID)?

windows - Perl 到 Linux 上的静态可执行文件

perl - 使用 perl -pe 删除文件的第一行

java - 什么时候计算枚举变量中的函数?

c++ - 如何使用cmake链接库

perl - 将 Perl 中的哈希解析为 CSV 格式

gcc - 在 CentOS - 6.X 上编译 Mono 源代码树时出错