In-place editing of multiple files in a directory using Perl's diamond and in-place edit operator

后端 未结 5 1412
挽巷
挽巷 2021-01-03 05:12

I am trying to in-place edit a bunch of text files using Perl\'s in-place edit operator $^I. I traverse through the directory using the diamond (<>) operator like this:

相关标签:
5条回答
  • 2021-01-03 05:51

    You can copy your arguments beforehand, and then use @ARGV. E.g.:

    my @args = @ARGV;
    @ARGV = <*.txt>;
    

    Since there is some hidden processing going on, which is specific to the use of @ARGV and the diamond operator <>, you cannot just use another array to do the same thing.

    0 讨论(0)
  • 2021-01-03 05:52

    Couldn't you just store the information from @ARGV that you still need into another variable?

    $^I = ".bak";
    
    my @options = @ARGV;
    @ARGV = <*.txt>;
    
    while (<>)
    {
        s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
        print;
    }
    
    0 讨论(0)
  • 2021-01-03 05:54

    My usual approach for this is to process the arguments and save the files off in a temporary list, then stuff them back into @ARGV.

    my @files;
    foreach (@ARGV) {
        ... do something with each parm
        else {
            push @files,$_;
        }
    }
    @ARGV=@files;
    while (<>) {
        ...
    

    Usually, in the foreach (@ARGV) I will do something like

    if (-f) {
        push @files,$_;
        next;
    }
    
    0 讨论(0)
  • 2021-01-03 05:55

    I would use Iterator::Files, see http://search.cpan.org/perldoc/Iterator::Diamond for reasons why

    use Iterator::Files;
    my $input = Iterator::Files->new( files => [ glob "*.txt" ] );
    while( <$input> ){
        s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
        print;
    }
    
    0 讨论(0)
  • 2021-01-03 05:58

    You can give @ARGV a temporary value with the local keyword:

    {
        local @ARGV = <*.txt>;
        while (<>) {...}
    } # @ARGV gets the old value back
    
    0 讨论(0)
提交回复
热议问题