在foreach循环中使用未初始化的值

时间:2014-10-23 11:03:36

标签: perl foreach

我的代码:

my $daemon = Proc::Daemon->new;
Proc::Daemon::Init(
    {   work_dir     => '/home/olex/develop',
        child_STDOUT => '/home/olex/develop/output.file',
        child_STDERR => '+>>debug.txt'
    }
);
if ( Proc::PID::File->running() ) {
    print "Already running\n";
    exit 0;
}
my @kids = ( 1 .. 4 );
my @childs;
my $kid_pid;
foreach $kid_pid (@kids) {
    $kid_pid = $daemon->Init(
        {   work_dir     => '/home/olex/develop',
            pid_file     => "kid_pid.pid",
            exec_command => 'perl /home/olex/develop/remote_imapd.pl',
        }
    );
    $childs[$kid_pid] = $daemon->Status($kid_pid);
}
print @childs, "\n";
my $string = join( ',', @childs );
print $string;

数组@childs的一个元素在STDERR中未初始化,但打印结果正常!在join导致大约,,.....,,2450,,2452,,2454,,2456后。为什么这样?我理解循环中的问题,但我似乎正在做正确的事情。我需要像2450,2452,2454,2456这样的字符串。

1 个答案:

答案 0 :(得分:4)

尽管我可以从您的代码和错误的模糊描述中了解到,但您的问题是数组中未初始化的元素。这意味着您的错误是:

Use of uninitialized value within @childs in join or string

您应该始终完全按照显示的方式复制/粘贴错误。别做其他事,因为这是浪费时间。

如果使用核心模块Data::Dumper打印阵列,例如:

use Data::Dumper;
...
print Dumper \@childs;

我怀疑你会得到以下输出:

$VAR1 = [
          undef,
          2050,
          2051,
          2052,
          2053
        ];

您可以清楚地看到元素0是undef。这来自于使用

my @kids = (1..4);
...
foreach $kid_pid (@kids) {
   ...
   $childs[$kid_pid] = $daemon->Status($kid_pid);
} 

数组获取初始化的索引1到4,但不是第一个元素编号为零0。在Perl中,数组索引从0开始,而不是1

为了避免这样的问题,不要直接分配给数组索引,而是使用push

push @childs, $daemon->Status($kid_pid);

当然,除非您需要索引。