#!/usr/bin/perl
my @allFiles=`ls *.gz`;
for my $file (@allFiles) {
if ($file =~ '0000*.gz') {
print $file;
}
}
我正在尝试上面的代码来打印所有前缀为0000的文件名。例如00001.gz,00002.gz等
与regex中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
的块中的代码针对每个代码运行,并且如果评估为true,则该元素通过。它是相同的正则表达式,默认情况下应用于作为隐式迭代器的$ _变量(并别名为当前处理的元素)。因此,grep
返回所需的列表。
对于您的特定示例,即使这样做也可以
my @files = glob "0000[0-9].gz";
print "$_\n" for @files;
这将获取所有文件0000
,其后跟一个数字.gz
。
请参阅链接文档中可接受的元字符列表File::Glob
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句