如何在 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;
尽管有条件
,仍会获取所有文件
@heds
的 map { }
包括对 </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";
有这个:
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;
尽管有条件
,仍会获取所有文件@heds
的 map { }
包括对 </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";