我是新來的腳本語言,我有一個任務說我需要從erl命令行中的給定參數中提取名稱。從Perl腳本中的命令行中提取參數作爲參數
我打電話的Perl腳本這樣
./perl.plx file.txt
,我需要得到的只有那file
名稱,而不是整個file.txt
我是新來的腳本語言,我有一個任務說我需要從erl命令行中的給定參數中提取名稱。從Perl腳本中的命令行中提取參數作爲參數
我打電話的Perl腳本這樣
./perl.plx file.txt
,我需要得到的只有那file
名稱,而不是整個file.txt
要獲取文件名,你需要提取它從@ARGV
,並將其分割在點上。
my $fileName = (split /\./, $ARGV[0])[0];
闡釋:「」上一個點(字符在正則表達式特殊字符,這意味着‘任何字符’
split /\./, $ARGV[0]
分片;將它從字面上看,你需要逃避它,因此,/\./
)。
(...)[0];
取第一個元素,即文件名。
爲什麼使用'split()'優先於File :: Basename? –
@DaveCross因爲我對OP的具體使用案例(我已經花了我一段時間來理解確切的問題,正如您從我的評論中的問題中看到的那樣)迅速做出響應。而且,如果我誠實的話,我操縱的文件名很少,所以我往往會忘記'File ::'。 – AntonH
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模塊,您可以利用這些工具中體現的最佳實踐和調試。
謝謝。正如我所說的,我是'perl'的新手,特別是命令行參數。但是非常感謝,很有幫助。 –
試着看看'@ ARGV',它是一個帶參數的數組。它在那裏。 – AntonH
是的,但看看如果我嘗試使用$ ARGV [0]它返回** file.txt **,它不是字符串類型,所以我不能使用分隔符分隔。所以就像我說的,它給了我整個** file.txt **,我只需要**文件**的名稱。 –
'@ ARGV'只包含字符串。這是你對他們做的事情。所以如果你用'file.txt'有'$ ARGV [0]',那麼你可以分割這個字符串'my $ name =(split /\./, $ ARGV [0])[0];' $ name'包含「文件」。 – AntonH