Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:未初始化值的使用_Perl - Fatal编程技术网

Perl:未初始化值的使用

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

下面是我用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 ($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