[英]Perl wildcard match of filenames from "ls" output
#!/usr/bin/perl
my @allFiles=`ls *.gz`;
for my $file (@allFiles) {
if ($file =~ '0000*.gz') {
print $file;
}
}
我正在嘗試使用上面的代碼打印所有前綴為 0000 的文件名。例如 00001.gz、00002.gz 等
在正則表達式中與 shell 的通配符*
相似的是.*
。 *
量詞表示它之前的模式匹配“零次或多次”次數和.
表示“任何字符”,請參閱perlre 中的正則表達式。 但似乎您想要零后的某些內容,然后使用.+
來匹配任何字符一次或多次。 要匹配文字句點,請轉義它, \\.
接下來,沒有理由使用外部命令來完成您的工作。 在 Perl 中
my @allFiles = glob "*.gz";
文檔鏈接在最后。
最后,請始終啟用警告和嚴格。
共
use warnings;
use strict;
my @allFiles = glob "*.gz";
foreach my $file (@allFiles) {
if ($file =~ /^0000.+\.gz/) {
print "$file\n";
}
}
正則表達式模式匹配:字符串開頭的0000
( ^
),后跟匹配一次或多次 ( +
) 的任何字符 ( .
),然后是文字句點 ( \\.
) 和文字gz
。 請注意, .+
表示.
匹配一次或多次,它不必是相同的字符。
調整到最適合您的實際需要和目錄內容的內容。 例如,如果您希望文件只包含零后的數字,則需要/^0000\\d+\\.gz/
。 要捕獲文件00001a.gz
,您需要在一串數字后允許非數字,例如/^0000\\d+.*\\.gz/
。
有關正則表達式教程和glob 的信息,請參閱perlretut ,對於名稱中帶有空格的內容,請參閱更好的File::Glob 。
還有其他方法可以做到這一點。 例如,您需要過濾文件名列表,因此
my @files = grep { /^0000.+\.gz/ } glob "*.gz";
glob
位於grep強加的列表上下文中,因此它返回它匹配的所有文件的列表。 (在標量上下文中,它遍歷它們。) grep
塊中的代碼為每個運行,如果計算結果為真,則該元素通過。 它是相同的正則表達式,默認情況下應用於作為隱式迭代器的$_ 變量(並別名為當前處理的元素)。 所以grep
返回所需的列表。
對於您的具體示例,即使只是這樣也可以
my @files = glob "0000[0-9].gz";
print "$_\n" for @files;
這將獲取0000
之后帶有一位數字的所有文件,然后是.gz
。
請參閱鏈接的File::Glob
文檔中接受的元字符列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.