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

3

我的代码片段:

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的字符串。


如果我使用 $childs[$kid_pid] = $kid_pid;,结果会相似。 - Kostiuk Aleksandr
你似乎在说你的错误是整个数组未初始化,但实际上只有一个元素(第一个)未初始化,而你的错误实际上是“在join或string中使用未初始化的@childs值”。 - TLP
是的,你说得对,我已经编辑过了。 - Kostiuk Aleksandr
以上代码的输出不可能是 ,,.....,,2450,,2452,,2454,,2456。你应该复制/粘贴你真正得到的输出。 - TLP
.....这是很多的,,, :) - Kostiuk Aleksandr
是的,但不能有“很多”,因为您只有索引1..4。因此,您的输出应该是,2450,2452,2454,2456,而没有双逗号“,,”。 - TLP
1个回答

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是未定义的。这是由于使用了

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);

除非当然,您需要索引来做某些事情。

是的,这是我的疏忽。谢谢。 - Kostiuk Aleksandr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接