我的代码:
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
这样的字符串。
答案 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);
当然,除非您需要索引。