2017-10-20 55 views
0

我有一個文件數量爲10個隨機單詞。我能夠讓我的Perl腳本排序文件,但我不知道爲什麼,因爲它排序和覆蓋主文件。 例如file.txt有:「a,c,d,b」我把它讀入文件名然後把它排序到另一個文件名sorted.txt「a,b,c,d」但是我不想讓我的file.txt原始文件進行更改。使用Shell腳本菜單用Perl對文件進行排序

這是調用我的殼菜單perl的排序功能:

if [ "$choice" = 2 ] 
    then 
     perl perlsort.pl "$filename" 
     cp $filename $outputfilename 
fi 

這是我的Perl代碼:

my $filename = shift @ARGV; 
open(FH,$filename) or die "$!"; 
my @lines = <FH>; 
close(FH); 

$, = "\n"; 

open(my $output, ">", "$filename") or die "Unable to open $filename: $!\n"; 
print $output sort map { chomp; $_ } @lines; 
close $output; 

回答

3

如果你不想Perl來覆蓋你的文件,不要」告訴它這樣做:

open(my $output, ">", "$filename")打開$ filename寫入,即覆蓋它。

也許爲輸出指定不同的文件名,或使用File::Temp

順便說一句,這是沒有意義的包$文件名進入在Perl雙引號,你可以直接

open my $output, '>', $filename or die ... 

此外,而不是通過線咬食線,你可以

chomp $lines; 
+0

正如你可以告訴我是Perl新手:) 我應該如何使用File :: Temp? – Nagne

+0

我討厭閱讀手冊頁,但您始終可以通過在終端中輸入以下內容來查找File :: Temp的文檔:perldoc File :: Temp – xyz123

1

你已經將已排序的內容寫入您的Perl代碼中的文件。嘗試將open(my $output, ">", "$filename")中的「$ filename」替換爲新文件名,以便腳本將寫入新文件而不是重寫輸入文件。因此,不要忘記從bash腳本中刪除cp $filename $outputfilename,否則它將用舊(輸入)文件的內容替換新文件。或者(如果$outputfilename與perl腳本中的新文件名不同),它將創建一個新的未分類文件,其中包含$outputfilename名稱和未分類內容,以3個文件結尾:2個包含未分類內容,1個 - 已分類。

相關問題