我的perl expertize是5/10。我写了一个带有2个参数的perl脚本。 Arg1 =字符串名称(~5000个字符串)和Arg2 =文件名(大小> 10GB)。该脚本应该输出另一个报告文件,该文件打印Arg2中与Arg1中的任何行匹配的每一行。
我面临的问题是,如果我将整个12GB文件作为Arg2传递,脚本只报告Arg1的一部分,但是如果我将文件拆分为100MB文件,则脚本工作正常。我相信我的脚本有一些限制,当12GB文件直接传递给它时会导致这个问题。我打开/读取Arg2文件为:while(my $ line = <$pnt_netlist
&gt;){chomp $ line; ... 等等
有没有办法我可以编写脚本来让perl读取一次说100000行,然后从100001到200000等等?
部分perl代码:
################################
#### reading the strings
##################################
$nets_counter = 0 ;
open(my $pnt_nets, $nets_file) or die "Could not open file '$nets_file' $!";
while (my $nets_line = <$pnt_nets>) {
if( $nets_line !~ /^#/ && $nets_line !~ /^$/ ) {
$nets_line =~ s/^\s+|\s+$//g ; # /
$nets_array[$nets_counter] = $nets_line ;
$nets_counter++ ;
} ## if ##
} ## while ##
################################
#### parse file with strings
##################################
sub search_net_in_netlist {
$reported_nets_counter = 0;
open(my $pnt_netlist, $netlist_file) or die "Could not open file '$netlist_file' $!";
$last_line = "\n" ;
while (my $line = <$pnt_netlist>) {
chomp $line;
if ( $line !~ /\+/ &&
$last_line =~ /$nets_array[$i]/ && $last_line !~ /^\s*$/ )
{
my $inst_name = @{[$last_line =~ m/\w+/g]}[0]; # /
for($j = 0; $j < $nets_counter ; $j++) {
$check_net_line = locate_net ($nets_array[$j], $last_line);
@check_net_line_1 = split(/ +/, $check_net_line);
$flag = @check_net_line_1[0];
$reprot_line = "$check_net_line_1[1] $check_net_line_1[2] $check_net_line_1[3]";
if( $flag == 1 ) {
print "$reprot_line \n" ;
} ## if ##
} ## for ##
} ## if ##
if( $line =~ /\+/ ) {
$last_line = "$last_line $line";
} else {
$last_line = $line ;
} ## if else ##
} ## while ##