perl foreach循环跳过特定文件夹下特定文件的迭代
perl foreach loop skip iteration for specific file under specific folder
我有 perl 脚本来从我的处理中排除一些路径。
现在我想在排除路径中添加一个新文件夹 (/foo/
),除文件名 Hello
外,应排除其下的所有内容
我知道我们可以使用关键字 next
来跳过循环,但是我怎样才能只对特定文件夹下的一个文件实现它呢?
文件夹 /foo/
可以在任何目录中,例如 abc/foo/def/
或 hij/klm/foo/
use strict;
use warnings;
my @excludepaths = (
"abc/def/",
"hij/klm/",
);
foreach (@excludepaths)
{
if (SOME_TEST_CONDITION) # exclude filename "Hello" under "Foo" folder
{
# move on to the next loop element
next;
}
# more code here ...
}
诀窍是 - 创建一个正则表达式,并使用 |
创建一个或条件。
所以使用你的:
my @excludepaths = (
"abc/def/",
"hij/klm/",
);
像这样把它变成正则表达式:
my $regex = join ( "|", map { quotemeta } @excludepaths );
$regex = qr/($regex)/;
那么你应该可以做到
next if m/$regex/;
例如:
my @excludepaths = (
"abc/def/",
"hij/klm/",
);
my $regex = join ( "|", @excludepaths );
$regex = qr/($regex)/;
for ( "abc/def/ghk", "abf/de/cg", "abf/hij/klm/ghf", "fish/bat/mix" ) {
next if m/$regex/;
print;
print "\n";
}
如果这样做,您可以将任何您喜欢的图案添加到您的 'exclude' 中,只需将其添加到列表中即可。
因此您可以添加 /foo/.*/Hello$
,它会跳过以下匹配项:
/some/path/to/foo/and/more/Hello
因为正则表达式路径是子字符串匹配。
编辑:根据您的评论:
my @excludepaths = ( "abc/def/", "hij/klm/", "/foo/", );
my $regex = join( "|", @excludepaths );
$regex = qr/($regex)/;
my $include_regex = qr,/foo/.*\bHELLO$,;
for (
"abc/def/ghk", "abf/de/cg",
"abf/hij/klm/ghf", "fish/bat/mix",
"/path/with/foo/not/HELLO", "/path/with/foo/",
"/path/with/foo/HELLO"
)
{
next if ( m/$regex/ and not m/$include_regex/ );
print;
print "\n";
}
我们明确排除任何包含 /foo/
的内容,但用 $include_regex
覆盖,这样 /path/with/foo/not/HELLO
仍然可以通过文件管理器。
我有 perl 脚本来从我的处理中排除一些路径。
现在我想在排除路径中添加一个新文件夹 (/foo/
),除文件名 Hello
我知道我们可以使用关键字 next
来跳过循环,但是我怎样才能只对特定文件夹下的一个文件实现它呢?
文件夹 /foo/
可以在任何目录中,例如 abc/foo/def/
或 hij/klm/foo/
use strict;
use warnings;
my @excludepaths = (
"abc/def/",
"hij/klm/",
);
foreach (@excludepaths)
{
if (SOME_TEST_CONDITION) # exclude filename "Hello" under "Foo" folder
{
# move on to the next loop element
next;
}
# more code here ...
}
诀窍是 - 创建一个正则表达式,并使用 |
创建一个或条件。
所以使用你的:
my @excludepaths = (
"abc/def/",
"hij/klm/",
);
像这样把它变成正则表达式:
my $regex = join ( "|", map { quotemeta } @excludepaths );
$regex = qr/($regex)/;
那么你应该可以做到
next if m/$regex/;
例如:
my @excludepaths = (
"abc/def/",
"hij/klm/",
);
my $regex = join ( "|", @excludepaths );
$regex = qr/($regex)/;
for ( "abc/def/ghk", "abf/de/cg", "abf/hij/klm/ghf", "fish/bat/mix" ) {
next if m/$regex/;
print;
print "\n";
}
如果这样做,您可以将任何您喜欢的图案添加到您的 'exclude' 中,只需将其添加到列表中即可。
因此您可以添加 /foo/.*/Hello$
,它会跳过以下匹配项:
/some/path/to/foo/and/more/Hello
因为正则表达式路径是子字符串匹配。
编辑:根据您的评论:
my @excludepaths = ( "abc/def/", "hij/klm/", "/foo/", );
my $regex = join( "|", @excludepaths );
$regex = qr/($regex)/;
my $include_regex = qr,/foo/.*\bHELLO$,;
for (
"abc/def/ghk", "abf/de/cg",
"abf/hij/klm/ghf", "fish/bat/mix",
"/path/with/foo/not/HELLO", "/path/with/foo/",
"/path/with/foo/HELLO"
)
{
next if ( m/$regex/ and not m/$include_regex/ );
print;
print "\n";
}
我们明确排除任何包含 /foo/
的内容,但用 $include_regex
覆盖,这样 /path/with/foo/not/HELLO
仍然可以通过文件管理器。