如何在 perl 中的数组上应用负正则表达式?

How to apply negative regex on array in perl?

有这个:

foo.pl:

#!/usr/bin/perl -w
@heds = map { /_h.+/ and s/^(.+)_.+// and "$_.hpp" } @ARGV;
@fls = map { !/_h.+/ and "$_.cpp" } @ARGV;

print "heds: @heds\nfls: @fls";

我想将 headers 与源文件分开,当我输入时:

$./foo.pl a b c_hpp d_hpp
heds: e.hpp f.hpp
fls: e.cpp f.cpp a.cpp b.cpp

headers 正确分隔,但文件被全部占用。为什么?我在映射中应用了负正则表达式 !/_h.+/,因此不应考虑带有 *_h* 的文件,但它们是。为什么这样?以及如何解决?

即使这样也不起作用:

@fls = map { if(!/_h.+/){ "$_.cpp" } } @ARGV;

尽管有条件

,仍会获取所有文件

@hedsmap { } 包括对 </code> 参数的替换并更改它。只需重新排序映射以避免对 <code>@fls 的影响,您就会得到想要的结果。但是,如果您需要在这些映射之后访问 @ARGV,它不再是原始的 @ARGV,就像您的示例代码中那样。

#!/usr/bin/perl -w
@fls = map { !/_h.+/ and "$_.cpp" } @ARGV;
@heds = map { /_h.+/ and s/^(.+)_.+// and "$_.hpp" } @ARGV;

print "heds: @heds\nfls: @fls\n";