2017-08-03 66 views
1

我正在Perl中編寫一個腳本,我必須在代碼中打開兩次相同的文件。這是我的代碼的輪廓:鑽石操作員似乎只能工作一次

#!/usr/bin/perl 
use strict; 
use warnings; 

my %forward=(); 
my %reverse=(); 

while(<>){ 
    chomp; 
    # store something 
    } 
} 

while(<>){ # open the same file again 
    chomp; 
    #print something 
} 

我現在用的鑽石經營者,所以我運行該腳本這樣

perl script.pl input.txt 

但這不產生任何輸出。如果我使用文件句柄打開文件,該腳本就可以工作。這裏可能有什麼錯誤?

回答

4

保存您的@ARGV後用盡。當然,這隻適用於在命令行中指定的實際文件,而不適用於STDIN

#!/usr/bin/env perl 

use strict; 
use warnings; 

run(@ARGV); 

sub run { 
    my @argv = @_; 
    first(@argv); 
    second(@argv); 
} 

sub first { 
    local @ARGV = @_; 
    print "First pass: $_" while <>; 
} 

sub second { 
    local @ARGV = @_; 
    print "Second pass: $_" while <>; 
} 
+0

嗨思南,我無法理解這件事。我必須將我的代碼粘貼到你的while(<>)事物中。你可以解釋嗎?? – user3138373

+1

@ user3138373將他的腳本複製並粘貼到編輯器中,並將其保存爲'read_file_twice.pl'。然後以'perl read_file_twice.pl input.txt'運行 – fugu

3

你讀完所有在第一個循環中讀取的內容,在第二個循環中沒有任何內容可讀。

如果輸入不是很大,可以簡單地將它加載到內存中。

my @lines = <>; 
chomp(@lines); 

for (@lines) { 
    ... 
} 

for (@lines) { 
    ... 
}