它应该是一个简单的嵌套的foreach循环,但它不工作,真的开始烦我,我无法弄清楚这一点!仍然是perl初学者,但我认为我现在已经明白了这一点。有人可以向我解释我哪里出错了吗?这个想法很简单:2个文件,1个小,1个大的信息,我想在小的一个。两者都有独特的身份证件。比较和匹配ID,并输出一个新的小文件,并在小文件中添加信息。嵌套的foreach循环不工作
我有2件代码:1没有严格和1与两者都不工作。我知道使用限制,但我仍然很好奇,为什么没有限制的人也没有工作。
不用其他STRICTS:
if ($#ARGV != 2){
print "input_file1 input_file2 output_file\n";
exit;
}
$inputfile1=$ARGV[0];
$inputfile2=$ARGV[1];
$outputfile1=$ARGV[2];
open(INFILE1,$inputfile1) || die "No inputfile :$!\n";
open(INFILE2,$inputfile2) || die "No inputfile :$!\n";
open(OUTFILE_1,">$outputfile1") || die "No outputfile :$!\n";
$i = 0;
$j = 0;
@infile1=<INFILE1>;
@infile2=<INFILE2>;
foreach (@infile1){
@elements = split(";",$infile1[$i]);
$id1 = $elements[3];
print "1. $id1\n";
$lat = $elements[5];
$lon = $elements[6];
$lat =~ s/,/./;
$lon =~ s/,/./;
print "2. $lat\n";
print "3. $lon\n";
foreach (@infile2){
@loopelements = split(";",$infile2[$j]);
$id2 = $loopelements[4];
print "4. $id2\n";
if ($id1 == $id2){
print OUTFILE_1 "$loopelements[0];$loopelements[1];$loopelements[2];$loopelements[3];$loopelements[4];$lat,$lon\n";
};
$j = $j+1;
};
@elements = join(";",@elements); # add ';' to all elements
#print "$i\r";
$i = $i+1;
}
close(INFILE1);
close(INFILE2);
close(OUTFILE_1);
没有是,如果我没有记错的第二循环将无法启动的错误。
WITH STRICTS:
use strict;
use warnings;
my $inputfile1 = shift || die "Give input!\n";
my $inputfile2 = shift || die "Give more input!\n";
my $outputfile = shift || die "Give output!\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";
my $i = 0;
my $j = 0;
foreach (my $infile1 = <$INFILE1>){
my @elements = split(";",$infile1[$i]);
my $id1 = $elements[3];
print "1: $id1\n";
my $lat = $elements[5];
my $lon = $elements[6];
$lat =~ s/,/./;
$lon =~ s/,/./;
print "2: $lat\n";
print "3: $lon\n";
foreach (my $infile2 = <$INFILE2>){
my @loopelements = split(";",$infile2[$j]);
my $id2 = $loopelements[4];
print "4: $id2\n";
if ($id1 == $id2){
print $OUTFILE "$loopelements[0];$loopelements[1];$loopelements[2];$loopelements[3];$loopelements[4];$lat,$lon\n";
};
$j = $j+1;
};
#@elements = join(";",@elements); # add ';' to all elements
#print "$i\r";
$i = $i+1;
}
close($INFILE1);
close($INFILE2);
close($OUTFILE);
与stricts错误:
Global symbol "@infile1" requires explicit package name at Z:\Data-Content\Data\test\jan\bestemming_zonder_acco\add_latlon_dest_test.pl line 16.
Global symbol "@infile2" requires explicit package name at Z:\Data-Content\Data\test\jan\bestemming_zonder_acco\add_latlon_dest_test.pl line 31.
啊,谢谢你解释它!我认为我的非严格版本的问题是它没有循环。但我想我在这里有足够的解释来查看我的错误。我知道,我更喜欢一个while循环,但我也想明白这一点(不适用于学校或类似的东西) – Jan 2012-08-13 13:08:41
正如dan1111指出的那样,非严格版本正在循环(通过@ infile2的元素)。但是,当你试图自己跟踪一个指数计数器,但忘记重置它时,$ infile2 [$ j]在大多数时间都将是'undef'。 – pmakholm 2012-08-13 13:25:47