2009-10-25 64 views
2

我正在學習Perl和構建,使用此代碼從文件中得到一個隨機線的應用:如何從Perl中的數組中刪除隨機值?

open(my $random_name, "<", "out.txt"); 
my @array = shuffle(<$random_name>); 
chomp @array; 
close($random_name) or die "Error when trying to close $random_name: $!"; 
print shift @array; 

但現在我想從文件中刪除此隨機名稱。我如何做到這一點?

+0

這是'shuffle'你寫的函數嗎? – 2009-10-25 12:35:40

+0

我假設它是List :: Util – DVK 2009-10-25 12:37:18

+0

我需要從文件中刪除名稱,並且DVK幫助了我。 – 2009-10-25 12:44:29

回答

4
  1. shift已經刪除從陣列的名稱。

    因此pop(一個從一開始,一個從結束) - 我會建議使用pop,因爲它可能更有效率,是一個隨機的,你不關心你使用哪一個。

  2. 或者您是否需要將其從文件中刪除?

    如果是這樣的話,你需要:

    A.得到的名字計數的文件中(如果小,如果大,閱讀這一切在使用File::Slurp內存,無論是行由行閱讀和計數或者乾脆通過反引號執行wc -l $filename命令。

    B.從1到< $行>(比如生成隨機#,$random_line_number

    C.按行讀取文件中的行。對於每一行讀,將它寫入另一個臨時文件(使用File::Temp生成臨時文件。除了不寫編號$random_line_number到文本文件

    D.關閉臨時文件和如果列表中包含文件名,而不是將其移動原始文件

  3. 的線,你需要刪除的文件本身(隨機文件),使用unlink()函數。不要忘記處理來自unlink()的返回碼,並且像任何IO操作一樣,打印包含$!的錯誤消息,這將成爲發生故障時系統錯誤的文本。

完成。

D.

+0

非常感謝DVK,非常好的解釋! – 2009-10-25 12:23:30

2

當你說「從列表中刪除這個......」你的意思是從文件中刪除嗎?如果你只是想從@array中刪除它,那麼你已經通過使用shift來完成。如果您希望將其從文件中刪除,並且順序無關緊要,只需將@array中的其餘名稱寫回文件即可。如果文件順序確實是,那麼您將不得不做一些稍微複雜的操作,例如重新打開文件,按順序讀取項目(除了不需要的項目),然後將它們全部寫入再次退出。要麼是這樣,要麼在閱讀文件時更多地注意到訂單。

1

如果您需要從文件中刪除一行(它不完全清楚您的問題),最簡單和最有效的方法之一是使用Tie::File來處理文件,就像它是一個數組一樣。否則perlfaq5解釋瞭如何做很長的路。

+0

+1 - DVK的答案有效(他解釋了操作文件所需的步驟),但是您的答案更好 - 不需要編寫代碼並使用抽象層。 – Ether 2009-10-25 19:58:40