gpt4 book ai didi

Perl 循环不工作

转载 作者:行者123 更新时间:2023-12-01 13:40:13 26 4
gpt4 key购买 nike

我正在研究一个简单的循环,但它不工作。我有 2 个文件,我根据一个公共(public) ID 进行比较。它之所以有效,是因为它只输出第一个结果,而且只输出第一个结果!所以它不会遍历其余文件(或最后一个文件,因为输出包含第一个文件中的所有行)。它输出第一个文件中的所有行,但仅将第二个文件中的第一个结果附加到输出文件中。这是我要澄清的代码:

use strict;
use warnings;

my $inputfile1 = shift || die "Give input & output!\n";
my $inputfile2 = shift || die "Give input & output!\n";
my $outputfile = shift || die "Give input!\n";

open my $INFILE1, '<', $inputfile1 or die "In use / Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "In use / Not found :$!\n";
open my $OUTFILE, '>', $outputfile or die "In use / Not found :$!\n";

while (<$INFILE1>) {
s/"//g;
my @elements = split /;/, $_;

while (<$INFILE2>) {
s/"//g;
my @loopelements = split /;/, $_;

if ($elements[11] eq $loopelements[0]){
$elements[12] = $loopelements[1];
$elements[13] = $loopelements[2];
}
}

my $output_line = join(";", @elements);
print $OUTFILE $output_line;
#print "\n"
}

close $INFILE1;
close $INFILE2;
close $OUTFILE;

exit 0;

我的第一次尝试是这段代码,它部分起作用了。为什么?:中途崩溃了。当我检查输出文件时,它工作到一半就停止了。不知道为什么!附带一提,我认为下面的那个效率较低,或者两者都有更好的选择吗?

$inputfile1=$ARGV[0];  
$inputfile2=$ARGV[1];
$outputfile1=$ARGV[2];

open(INFILE1,$inputfile1) || die "Give input & output :$!\n";
open(INFILE2,$inputfile2) || die "Give input & output :$!\n";
open(OUTFILE_1,">$outputfile1") || die "Give input & output :$!\n";

$i = 0;
$j = 0;

@infile1=<INFILE1>;
@infile2=<INFILE2>;

foreach ( @infile1 )
{
@elements = split(";",$infile1[$i]);
$j=0;

foreach ( @infile2 )
{
@loopelements = split(";",$infile2[$j]);

if ($elements[11] eq $loopelements[0]){
$elements[12] = $loopelements[1];
$elements[13] = $loopelements[2];
$printen = 1;
last;
}

$j = $j+1;
}

@elements = join(";",@elements);
print "$i\r";
if ($printen == 1) { print OUTFILE_1 "@elements"; };

$i = $i+1;
}
close(INFILE1);
close(INFILE2);
close(OUTFILE_1);

那么有人可以指出我在顶部的代码中哪里出错了吗?

最佳答案

  1. 在外循环的第一次迭代中读取第一个文件的第一行。

  2. 在第一次迭代过程中,所有第二个文件的行都在内循环中读取。

  3. 然后外层循环的第一次迭代结束。

  4. 现在,外循环的第二次迭代出现了。第二个文件中是否还有任何行需要阅读?没有。

将问题分解为最简单的问题,旁边带有注释的两行使程序每次循环遍历第二个文件的行:

use warnings;

my $inputfile1 = shift || die "Give input & output!\n";
my $inputfile2 = shift || die "Give input & output!\n";

open my $INFILE1, '<', $inputfile1 or die "In use / Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "In use / Not found :$!\n";

my $infile2_pos = tell $INFILE2; # remember start position

while (<$INFILE1>) {

print;

seek $INFILE2, $infile2_pos, 0; # seek the start position

while (<$INFILE2>) {
print;
}
}

如果这太慢,我认为您可以做两件事:

  1. 在外循环中读取更大的文件(我猜你知道为什么这会加快速度)。
  2. 最初将较小的文件读入数组,因此您不必对其重复执行磁盘 I/O。

我的意思是:

open my $BIGFILE,  '<', $bigfile or die "In use / Not found :$!\n";
open my $SMALLFILE, '<', $smallfile or die "In use / Not found :$!\n";

my @smallfile_array = <$SMALLFILE>;

while (<$BIGFILE>) {

print;

foreach (@smallfile_array) {
print;
}
}

关于Perl 循环不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11409450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com