我正在尝试使用Perl的就地编辑操作符$ ^ I就地编辑一堆文本文件。我使用菱形(<>)运算符遍历目录,如下所示:
$^I = ".bak";
@ARGV = <*.txt>;
while (<>)
{
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
这完美无缺,完成了我需要做的工作。但是如果我的@ARGV已经填充了我需要的其他一些数据呢?我试着做以下事情:
$^I = ".bak";
my @files = <*.txt>;
while (<@files>)
{
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
但它不起作用。我在这里错过了什么?我不能使用我的$ ARGV,因为它包含其他数据,不能用文件匹配模式搞乱它。
有什么建议吗?
谢谢!
答案 0 :(得分:4)
您可以预先复制参数,然后使用@ARGV
。 E.g:
my @args = @ARGV;
@ARGV = <*.txt>;
由于存在一些隐藏处理,特定于@ARGV
和菱形运算符<>
的使用,您不能只使用另一个数组来执行相同的操作。
答案 1 :(得分:4)
您可以使用@ARGV
关键字为local
提供临时值:
{
local @ARGV = <*.txt>;
while (<>) {...}
} # @ARGV gets the old value back
答案 2 :(得分:2)
难道你不能将你仍然需要的@ARGV信息存储到另一个变量中吗?
$^I = ".bak";
my @options = @ARGV;
@ARGV = <*.txt>;
while (<>)
{
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
答案 3 :(得分:0)
我会使用Iterator :: Files,请参阅http://search.cpan.org/perldoc/Iterator::Diamond了解原因
use Iterator::Files;
my $input = Iterator::Files->new( files => [ glob "*.txt" ] );
while( <$input> ){
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
答案 4 :(得分:0)
我通常采用的方法是处理参数并将文件保存在临时列表中,然后将它们填充回@ARGV。
my @files;
foreach (@ARGV) {
... do something with each parm
else {
push @files,$_;
}
}
@ARGV=@files;
while (<>) {
...
通常,在foreach(@ARGV)中我会做类似
的事情if (-f) {
push @files,$_;
next;
}