2013-04-08 269 views
0

看到腳本(見下文),但無法找到更多關於「-n」的信息。腳本中的「-n」是什麼?

my $numeric =0; 
my $input = shift; 
if ($input eq "-n") { 
    $numeric =1; 
    $input = shift; 
} 
my $output = shift; 
open INPUT, $input or die $!; 
open OUTPUT, ">$output" or die $!; 
my @file = <INPUT>; 
if ($numeric) { 
    @file = sort { $a <=> $b } @file; 
} else { 
    @file = sort @file; 
} 
print OUTPUT @file; 

文本解釋腳本說下面「如果我們我們的程序名後命令行上看到的第一件事情是字符串-n,那麼我們正在做數字排序。」 Google搜索似乎無法識別大多數「非字母數字」符號,因此"-n"搜索不會產生任何結果。我看到的唯一的其他地方"-n"在學習perl,它表示以下「轉換的sed腳本可以使用或不使用-n選項」。甚至不知道這是否與腳本中的"-n"一樣。任何想法,我可以找到關於-n更多信息(雖然它可能只是一個數字字符串??沒有別的更多)

回答

5

該腳本使用的-nperl使用的-n標誌完全無關。換句話說,這樣的:

perl -n script.pl 

從此完全不同:

perl script.pl -n 

你有什麼是第二種情況。看一看的文檔shift

檔陣列的第一個值開始並返回它,由1縮短 陣列和移動都記錄下來。如果 數組中沒有元素,則返回未定義的值。如果省略了ARRAY,則將子例程和格式的詞法範圍內的@_ 數組以及子例程外部的 @ARGV數組以及由eval STRING,BEGIN {},INIT {}等語言創建的詞法範圍 CHECK {}, UNITCHECK {}和END {}構造。

這是一個mouthfull,但就是它的意思是說,如果我們在一個子程序不是和shift自動出現,它要搶@ARGV的第一要素。什麼是@ARGV?讓我們來看看在perlvar,所有那些怪異的變量都記錄:

數組@ARGV包含打算 腳本的命令行參數。

請注意,這些都爲腳本的參數,而不是perl的。所以如果有人執行你的腳本perl script.pl -n,那麼我們可以預期$ARGV[0]是字符串-n

現在你的代碼來看,很明顯這是怎麼回事:

my $input = shift; 
if ($input eq "-n") { 
    $numeric =1; 
    $input = shift; 
} 

他們使用shift沒有參數和子程序外搶的@ARGV的第一要素。如果這是-n,變量$numeric設置爲1.該變量控制腳本的行爲方式。 (該腳本繼續從@ARGV中獲取輸入和輸出文件的名稱。)

1

它是此腳本本身的命令行參數。如果用戶使用腳本名稱後跟「-n」來調用它,那麼這將告訴腳本如何表現。

+0

仍然困惑。腳本究竟應該如何表現?即帶或不帶-n,有什麼區別? – 2013-04-08 04:29:41

+1

「-n」只是腳本的創建者選擇表示輸入文件應該按照數字排序而不是字母數字排序。它與任何其他程序的命令行參數無關。作者本來可以很好地選擇「-i」或「--sort_numerically」 – imran 2013-04-08 04:35:53

+1

你不會在互聯網上找到它。你找到的代碼評論解釋了它。它對文件進行排序。假設該腳本被稱爲「分揀機」。然後,如果他們在命令行上寫入「sorter infile outfile」,它將讀取infile中的每一行,按字母順序對它們進行排序,然後將結果寫入outfile。但是,如果他們寫入「sorter -n infile outfile」,那麼它將讀取行並將它們排序爲數字而不是字符串。 – 2013-04-08 04:36:38