【发布时间】:2014-12-15 01:39:34
【问题描述】:
我有一个脚本可以打开 .txt 文件、创建一个数组并进行一些替换。然后我关闭并打开文件句柄并根据四列删除重复行并保留最新行。这一切都是我想要的。但是当我尝试在脚本中间没有打开和关闭的情况下运行它时,我得到一个空白文件。
#!/usr/bin/perl
use strict;
use warnings;
#use diagnostics;
my $file = "c:\\tmp.txt";
open( my $fh, "<", $file ) or die $!;
my $OUTNET = "c:\\NETtmp.txt";
open( OUTPUT, ">", "$OUTNET" ) or die $!;
my @array;
foreach (<$fh>) {
chomp;
if ($_ =~ m/^\s+\d/) {
$_ =~ s/^\s+//g;
$_ =~ s/\s+$//g;
$_ =~ s/\s+/,/g;
print " $_ \n";
printf OUTPUT "$_ \n";
}
}
close OUTPUT; # Do I need to save and then reopen the file here?
my $file2 = "c:\\NETtmp.txt";
my $OUTNET2 = "c:\\final.txt";
open my $in, '<', $file2 or die $!;
open my $out, '>', $OUTNET2 or die $!;
seek $in, 0, 0;
my %hash;
while (<$in>) {
my $key = join ',', ( split /,/ )[ 1, 2, 3, 4 ];
printf $out $_ unless $hash{$key}++;
}
close $out;
close $in;
【问题讨论】:
-
你认为
( split /,/ )[ 1, 2, 3, 4 ]创建了一个由4个不同元素组成的字符串吗?因为它没有。 -
您没有运行此代码,因为它不严格兼容。发布有关您实际上并未运行的代码的问题是毫无用处的。您应该始终剪切和粘贴所有相关代码,最好创建一个sscce。
-
这对我的 $file = "c:\\tmp.txt" 有效; open(my $fh, ") { chomp; if ( $_ =~ m/^\s+\d/ ) { $_ =~ s/^\s+//g; $_ =~ s/\s+$//g; $_ =~ s/\s+/,/g;推@array, "$_ \n"; }} 我的 $OUTNET2 = "c:\\final.txt";打开我的 $out, '>', $OUTNET2 或者死 $!;我的 %hash; for (@array) { my $key = join ',', ( split /,/ )[ 1, 2, 3, 4 ];打印 $out $_ 除非 $hash{$key}++; }
标签: perl