我实际上在Windows 7 perl 5 v20中捕获了令人讨厌的错误。但是,我对原因很感兴趣。我一定以某种方式弄乱了内部迭代,但是我想知道为什么/如何做,所以我可以避免这种情况!如果遮盖下面标记为有问题的部分,则会发现可以找到感兴趣的名称。否则,它将永远找不到!
use strict;
use warnings;
my %hashofhashes;
my @headers;
my ($i, $temp, $flag)=0;
open FILE, '<', 'C:\direction\to\file.txt' or die $!;
while ( $line = <FILE> ) {
$line =~ /^(.*?)\t(.*?)\t(.*?)\t/;
$hashofhashes{$1}{$2} = $3; # a bit more logic, but this is the idea behind it
push @headers, $1;
}
close FILE;
open SAVE, '>', 'C:\somewhere\important\savefile.txt' or die $!;
open SAVED, '>', 'C:\somewhere\important\savefileD.txt' or die $!;
print SAVE "Name";
print SAVED "Name";
for ( $i = 0; $i < scalar @headers; $i++ ) {
print SAVE "\tAverage\tlog2\tfold (loss/normal) $headers[$i]\tp-value $headers[$i]";
print SAVED "\tAverage\tlog2\fold (gain/normal) $headers[$i]\tp-value $headers[$i]";
$temp++;
print "$temp: $headers[$i]\n"; # visual QC on prompt
if ($headers[$i] eq 'Joe') {
print "FOUND IT!!! $headers[$i]\n";
<STDIN>;
$flag = 1;
}
if ($temp == 100) {
print "Have done " . $i++ . " of ". scalar @headers . "\n";
$temp = 0; # this is the offending line!!!
}
print SAVE "\n";
print SAVED "\n";
unless ($flag) {
print "sorry bud!\n";
die;
}
}
标志的想法在这里的代码中是新的,但是for循环中遵循的逻辑是精确的。 QCing报告 header 中存储了2123个不同的元素,并且丢失了20个。
有任何想法吗?
谢谢!
最佳答案
我想您想要更多类似这样的东西:
use v5.10;
open my $save, '>', 'C:\somewhere\important\savefile.txt' or die $!;
open my $saved, '>', 'C:\somewhere\important\savefileD.txt' or die $!;
print { $save } "Name";
print { $saved } "Name";
open my $fh, '<', 'C:\direction\to\file.txt' or die $!;
my $found = 0;
while( my $line = <FILE> ){
my( $name, $second, $last ) = $line =~ /^(.*?)\t(.*?)\t(.*?)\t/;
if( $name eq 'Joe' ) {
say "Found it on line $.!";
<STDIN>;
$found++;
}
say "Processed $. lines" unless $. % 100;
print { $save } "\tAverage\tlog2\tfold (loss/normal) $name\tp-value $headers[$i]";
print { $saved } "\tAverage\tlog2\fold (gain/normal) $name\tp-value $headers[$i]";
}
close $fh;
say "Did not find it!" unless $found;
看起来您正在逐行处理数据,因此您不需要加载数组,以后您将逐个元素进行处理。只需在同一循环中完成所有操作即可。
我认为您正在使用
$temp
每100个元素输出一条进度消息。 Perl在$.
中有一个内置的行计数器,因此您可以使用它。您可以使用模数运算符%
来测试它是否可以被100整除。如果是(因此,没有余数),则输出进度消息。您无需重置$temp
,因为200、300等仍可以被100整除。在您的代码中,您将在
$i
中以及在与for
愚弄的条件下增加$temp
。每100个元素,您将增加$i
,然后for
将在下一次迭代之前再次执行此操作。然后,您跳过了每100行。我知道您正在做的事情比较复杂,并且哈希可能会起作用,但是您可以调整此想法以适合您的工作。
最后,如果您想让其他人想提供帮助,请帮助他们自由使用垂直空格将语句分组为段落和水平空格以对齐通用结构。 :)
关于arrays - Perl数组迭代错误-发现错误,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32388862/