2017-03-04 94 views
-4

我是新來的腳本語言,我有一個任務說我需要從erl命令行中的給定參數中提取名稱。從Perl腳本中的命令行中提取參數作爲參數

我打電話的Perl腳本這樣

./perl.plx file.txt 

,我需要得到的只有那file名稱,而不是整個file.txt

+1

試着看看'@ ARGV',它是一個帶參數的數組。它在那裏。 – AntonH

+0

是的,但看看如果我嘗試使用$ ARGV [0]它返回** file.txt **,它不是字符串類型,所以我不能使用分隔符分隔。所以就像我說的,它給了我整個** file.txt **,我只需要**文件**的名稱。 –

+1

'@ ARGV'只包含字符串。這是你對他們做的事情。所以如果你用'file.txt'有'$ ARGV [0]',那麼你可以分割這個字符串'my $ name =(split /\./, $ ARGV [0])[0];' $ name'包含「文件」。 – AntonH

回答

0

要獲取文件名,你需要提取它從@ARGV,並將其分割在點上。

my $fileName = (split /\./, $ARGV[0])[0]; 

闡釋:「」上一個點(字符在正則表達式特殊字符,這意味着‘任何字符’

split /\./, $ARGV[0]分片;將它從字面上看,你需要逃避它,因此,/\./)。

(...)[0];取第一個元素,即文件名。

+0

爲什麼使用'split()'優先於File :: Basename? –

+0

@DaveCross因爲我對OP的具體使用案例(我已經花了我一段時間來理解確切的問題,正如您從我的評論中的問題中看到的那樣)迅速做出響應。而且,如果我誠實的話,我操縱的文件名很少,所以我往往會忘記'File ::'。 – AntonH

5

Perl腳本的命令行參數出現在@ARGV中,如perldoc perlvar中所述。

解析文件名似乎不重要,但外觀可能會引起誤解。但是,Perl附帶一個名爲File::Basename的模塊,用於處理您可能不會立即考慮的邊緣情況。簡單的split不能處理的一個邊緣情況是除了最後的後綴之外,點可能出現在文件名的其他地方。

您可以在命令提示符處輸入perldoc File::Basename來查看File::Basename的文檔。

下面是一個例子:

use stict; 
use warnings; 
use File::Basename qw(fileparse); 

my ($fname, $dirs, $suffix) = fileparse($ARGV[0], qr/\.txt/); 

print "Base file name is $fname\n"; 
print "Suffix is $suffix\n"; 
print "Path to $fname$suffix is $dirs\n"; 

由於此模塊附帶的Perl,你不需要安裝任何東西來使用它。利用每個Perl發行版附帶的核心Perl模塊,您可以利用這些工具中體現的最佳實踐和調試。

+0

謝謝。正如我所說的,我是'perl'的新手,特別是命令行參數。但是非常感謝,很有幫助。 –