第二个(独立的)while循环不在Perl中执行

时间:2016-10-11 18:51:55

标签: perl oop while-loop io

我正在尝试使用Perl脚本使用两个独立的while循环读取两个单独的文件。我使用面向对象的方式来读取文件(Module IO :: File)。读取file1的第一个while循环工作正常,但读取file2的第二个while循环没有读取任何内容。我的代码如下,

try( RevWalk walk = new RevWalk( repository ) ) {
  RevCommit commit = walk.parseCommit( master.getObjectId() );
}    

我在第二个while循环中写了几个print语句,看它们是否正在执行。我发现打印语句没有执行,这意味着程序没有进入第二个while循环。这意味着第二个while循环的getline()语句可能有问题,但我不知道如何解决这个问题。任何帮助,将不胜感激。 编辑:为简洁起见,我在代码中省略了一些变量声明。

Edit2:这是我正在做的最小例子。

 #!/usr/bin/perl
 use 5.18.0;
 use warnings;
 use IO::File;
 $file1="file1.dat";
 $file2="file2.dat";
 my $f1 = IO::File -> new("< $file1") or die "Cannot read file1: $!"; 
 my $f2 = IO::File -> new("< $file2") or die "Cannot read file2: $!";

 while ( $linef1 = $f1 -> getline() ){
      data extraction from file 1 
}
$f1 -> close;
while ( $linef2 = $f2 -> getline() ){
    data extraction from file 2
   }

此代码运行时没有任何错误,并给了我以下输出。

#!/usr/bin/perl
use 5.18.0;
use warnings;
use IO::File;

my $output_filename = $ARGV[0];
my $file = substr($output_filename,0,-4);
my $line;
my $linef;
my $foo = 0;
my $bar = 0;
my $fchk_filename = "hcho_fr.fchk";

my $fout = IO::File -> new("< $output_filename") or die "Cannot read log file: $!"; 
my $ffchk = IO::File -> new("< $fchk_filename") or die "Cannot read fchk file: $!";

 while ( $line = $fout -> getline() ){
    if ($line =~ /Initial\sParameters/){
      $foo++;
      print("Still in the first while loop.\n");
     }
  }

  print("First while loop completed.\n");
  $fout -> close;

  while ( $linef = $ffchk -> getline() ){
  print("Entered the second while loop.\n");
  if ( $linef =~ /Cartesian Gradient/ ){
    $bar++;
    print("Still in the second while loop.\n");
     }
   }

   print("Successfully executed.\n");

1 个答案:

答案 0 :(得分:-1)

以下是一些想法:

最有可能的是 - 第二个文件是否以空行开头?您是否有可能获得空虚但真实的价值?或许最好检查一下

while ( defined($linef = $ffchk -> getline()) ){
  print("Entered the second while loop.\n");
  if ( $linef =~ /Cartesian Gradient/ ){
    $bar++;
    print("Still in the second while loop.\n");
  }
}

只是为了确保您获得定义的值而不是可能为空的值。

如果您阅读其他文件会怎样?或者与第一个循环相同的文件?确保它不是简单的东西,比如缺少换行符。

最后,您是否尝试过添加&#34; $ | = 1&#34;你的代码,以确保输出没有被缓冲到某个地方?这是一个很长的镜头,但有时输出可能看起来没有被显示,因为它在缓冲区中等待在它出现之前被冲洗。我怀疑这是否发生在这里,但这是一个绝对肯定的好方法。

这些只是基于你描述的内容的一些随机想法。