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:
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.
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;
}
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;
}
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;
}
You can give @ARGV
a temporary value with the local
keyword:
{
local @ARGV = <*.txt>;
while (<>) {...}
} # @ARGV gets the old value back