我正在编写我的第一个Perl程序,这是一个很糟糕的程序。我很高兴地说,大部分内容都是有效的,搜索这个网站对我的大部分问题都有帮助。
我正在处理由空格分隔值组成的大文件。我向下过滤文件以仅显示其中一列中具有特定值的行,并将过滤后的数据输出到新文件。然后我尝试将该文件的所有行都推送到一个数组中以用于循环。这是一些代码:
my @orig_file_lines = <ORIG_FILE>;
open MAKE_NEW_FILE, '>', 'newfile.dat' or die "Couldn't open newfile.dat!";
&make_new_file(\@orig_file_lines); ##Creates a new, filtered newfile.dat
open NEW, "newfile.dat" or die "Couldn't open newfile.dat!";
my @lines;
while(<NEW>){
push(@lines,$_);
}
printf("%s\n", $lines[$#lines]); ##Should print entirety of last line of newfile.dat
问题是双重的:1。$#lines = 24500这里新创建的文件(newfile.dat)实际上有24503行(所以它应该是24502),2。printf语句返回截断的行24500,切割过早地离开那条线大约两列。
每隔一行,例如$ lines [0-24499],即使它比$ lines [24500]更宽,也会成功打印整行,所以特定行的长度(它们都很长)不是问题。但这几乎就像阵列变得太大一样,因为它切断了一条线的一部分,然后是接下来的两条线。如果是这样,我该怎么做呢?
答案 0 :(得分:0)
在使用NEW打开相同文件之前,您似乎忘了关闭MAKE_NEW_FILE。
其他一些要点:
&function
语法基本上已被弃用,因为它绕过了原型检查。
我相信您使用的是use warnings;
和use strict;
。
我注意到你有一个双参数打开和一个三参数open
。虽然两者都是合法的,但它们具有不同的思维模式,这使得它们一起混淆程序员。我会坚持打开这三个论点,因为我认为它更容易理解(除非你正在打码高尔夫)