Perl:未初始化值的使用
下面是我用Perl编写的代码的一个小摘录。我发现了错误 错误:使用未初始化的值$key 但我不知道为什么Perl:未初始化值的使用,perl,Perl,下面是我用Perl编写的代码的一个小摘录。我发现了错误 错误:使用未初始化的值$key 但我不知道为什么$key在内部for循环中更改,但我无法访问外部的值。谁能告诉我我做错了什么 #!/usr/bin/perl -w use strict; use warnings; use Parallel::ForkManager; use Cwd; my $MAX_PROCESSES=16; print(cwd); print "\n"; my $num_args = $#ARGV + 1; if
$key
在内部for循环中更改,但我无法访问外部的值。谁能告诉我我做错了什么
#!/usr/bin/perl -w
use strict;
use warnings;
use Parallel::ForkManager;
use Cwd;
my $MAX_PROCESSES=16;
print(cwd);
print "\n";
my $num_args = $#ARGV + 1;
if ($num_args < 2) {
print "\nUsage: rot_align_spider.pl <folder containing particles> <reference>\n";
exit;
}
my $folder_name=$ARGV[0];
my $ref=$ARGV[1];
print "Input, $folder_name $ref\n";
system('rm -r rot_align_spider');
system('mkdir rot_align_spider');
my $mv_cmd="cp $folder_name/*.app rot_align_spider";
system($mv_cmd);
system("cp $ref rot_align_spider");
chdir "rot_align_spider";
my @files=`ls *.app`;
#print "@files";
print (cwd);
print "\n";
foreach (@files) {
chomp($_);
#print "$_\n";
my $new_name=$_;
#print "$new_name\n";
$new_name=~s/\.app$//g;
my $rename_files_cmd="mv $_ $new_name";
print "Renaming file $_ to $new_name\n";
system($rename_files_cmd);
}
my $ref_vol=substr($ref,0,-4);
my $new_ref_vol=$ref_vol."_iter_0";
my $ref_cp_cmd="cp $ref $new_ref_vol.spi";
system($ref_cp_cmd);
@files=`ls "$folder_name"*.spi`;
for(my $i=0;$i<1;$i++) {
my $pm=new Parallel::ForkManager($MAX_PROCESSES);
my $ref_id=$i+1;
my $key; #$key defined here
my $j;
for($j=0;$j<scalar(@files);$j++) {
my $pid=$pm->start and next;
chomp($files[$j]);
my $base_name=substr($files[$j],0,-4);
#print "$base_name\n";
my $soc_file_name=$base_name.".soc";
#print "$soc_file_name\n";
my $exp_vol=substr($files[$j],0,-4);
my $aligned_exp_vol=$exp_vol."_iter";
my $ref_vol=substr($ref,0,-4);
$key=$j+1;
open SOC,">$soc_file_name" || die "Can't open file: $!";
print SOC <<EOF;
MD
RESULTS OFF
MD
FBS ON
OR 3Q [phi],[the],[psi],[cc]
$exp_vol
$new_ref_vol
29
0,0,0
SD $key,[phi],[the],[psi],[cc]
cc2n_spider
SD E
ROT
$exp_vol
$aligned_exp_vol
[phi],[the],[psi]
F
U
END
EOF
close SOC;
my $spider_cmd="spider_linux_mp_intel64 soc\/spi \@$base_name";
print "$spider_cmd\n";
system($spider_cmd);
print "$key\n"; #$key printed here in the inner-loop
$pm->finish;
}
#$key=$j;
$pm->wait_all_children;
print "$ref_id $key\n"; #$key printed here in the outer-loop
my $avg_soc_file_name=$folder_name.".soc";
$new_ref_vol=$ref_vol."_iter_".$ref_id;
open SOC,">$avg_soc_file_name" || die "Can't open file: $!";
print SOC <<EOF;
MD
RESULTS OFF
MD
FBS ON
AS S
${folder_name}_bin4x_***_iter
1-$key
A
$new_ref_vol
END
EOF
close SOC;
my $spider_cmd="spider_linux_mp_intel64 soc\/spi \@$folder_name";
print "$spider_cmd\n";
system($spider_cmd);
}
内部循环的第一行中有一个
next
,主进程在每次start
调用后都会执行该调用(因为在主进程中start
返回子进程的非零PID;我猜如果它不能启动,它会返回-1
,就像系统级fork
一样)因此,$key
在整个循环的主线程中保持未定义状态
此外,您不能在分叉进程中设置$key
,并在父进程中更改它:它们是没有共享数据的独立进程。您可以使用第二个参数to的finish
方法将数据从子级发送回,并在
上运行以收集数据。有关更多信息,请阅读模块文档的一节
最后,您可能只能得到16个子项,因为$MAX\u processs
是16,并且wait\u所有子项在循环完成之前都不会发生;添加wait_for_available_procs()调用start
之前的循环中的code>应该会有所帮助。是不是应该在20之后出现(没有多余的)
它对我有效。同上。这是一个简化的示例,旨在显示实际代码中发生的警告吗?如果是这样,请提供实际的代码,或者提供一个实际显示问题的简化示例。带括号的代码不会编译。没有代码的代码可以正常工作。这不是一个输入错误,就是一个不完整的例子。你得到了多个反对票,因为除了通常建议避免C风格的for
循环外,你显示的代码运行良好。除非您发布真正的代码,否则无法猜测它可能有什么问题,但我们很乐意提供帮助
**** SPIDER NORMAL STOP ****
28
**** SPIDER NORMAL STOP ****
24
**** SPIDER NORMAL STOP ****
25
**** SPIDER NORMAL STOP ****
29
**** SPIDER NORMAL STOP ****
32
**** SPIDER NORMAL STOP ****
31
**** SPIDER NORMAL STOP ****
33
**** SPIDER NORMAL STOP ****
34
**** SPIDER NORMAL STOP ****
35
**** SPIDER NORMAL STOP ****
36
**** SPIDER NORMAL STOP ****
38
**** SPIDER NORMAL STOP ****
39
**** SPIDER NORMAL STOP ****
41
**** SPIDER NORMAL STOP ****
42
**** SPIDER NORMAL STOP ****
40
**** SPIDER NORMAL STOP ****
37
Use of uninitialized value $key in concatenation (.) or string at ../../rot_align_spider.pl line 104.
Use of uninitialized value $key in concatenation (.) or string at ../../rot_align_spider.pl line 108.
1