使用Perl的菱形和就地编辑操作符就地编辑目录中的多个文件

时间:2012-02-10 17:26:53

标签: perl

我正在尝试使用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,因为它包含其他数据,不能用文件匹配模式搞乱它。

有什么建议吗?

谢谢!

5 个答案:

答案 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;
}