使用Perl';就地编辑目录中的多个文件;s菱形和在位编辑操作符
我尝试使用Perl的就地编辑操作符$^I就地编辑一组文本文件。我使用菱形()操作符遍历目录,如下所示:使用Perl';就地编辑目录中的多个文件;s菱形和在位编辑操作符,perl,Perl,我尝试使用Perl的就地编辑操作符$^I就地编辑一组文本文件。我使用菱形()操作符遍历目录,如下所示: $^I = ".bak"; @ARGV = <*.txt>; while (<>) { s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g; print; } $^I=“.bak”; @ARGV=; 而() { s/((?:^ |\s)-?)(0+(=\s |$)/$1.2/g; 印刷品; } 这是完美的工作,做的工作,我需要它
$^I = ".bak";
@ARGV = <*.txt>;
while (<>)
{
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
$^I=“.bak”;
@ARGV=;
而()
{
s/((?:^ |\s)-?)(0+(=\s |$)/$1.2/g;
印刷品;
}
这是完美的工作,做的工作,我需要它做。但是,如果我的@ARGV已经填充了我需要的其他数据,该怎么办?我试着做到以下几点:
$^I = ".bak";
my @files = <*.txt>;
while (<@files>)
{
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
$^I=“.bak”;
我的@files=;
而()
{
s/((?:^ |\s)-?)(0+(=\s |$)/$1.2/g;
印刷品;
}
但它不起作用。我在这里错过了什么?我不能使用我的$ARGV,因为它包含其他数据,并且不能与文件匹配模式混淆
有什么建议吗
谢谢 您可以事先复制参数,然后使用
@ARGV
。例如:
my @args = @ARGV;
@ARGV = <*.txt>;
my@args=@ARGV;
@ARGV=;
由于存在一些隐藏处理,这是特定于使用
@ARGV
和菱形运算符
,因此不能仅使用另一个数组来执行相同的操作。您可以使用@ARGV
关键字为@local
提供一个临时值:
{
local @ARGV = <*.txt>;
while (<>) {...}
} # @ARGV gets the old value back
{
本地@ARGV=;
而(){…}
}#@ARGV获取旧值
您不能将@ARGV中仍然需要的信息存储到另一个变量中吗
$^I = ".bak";
my @options = @ARGV;
@ARGV = <*.txt>;
while (<>)
{
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
$^I=“.bak”;
我的@options=@ARGV;
@ARGV=;
而()
{
s/((?:^ |\s)-?)(0+(=\s |$)/$1.2/g;
印刷品;
}
我会使用迭代器::文件,有关原因,请参阅
use Iterator::Files;
my $input = Iterator::Files->new( files => [ glob "*.txt" ] );
while( <$input> ){
s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g;
print;
}
使用迭代器::文件;
my$input=Iterator::Files->new(Files=>[glob”*.txt]];
而(){
s/((?:^ |\s)-?)(0+(=\s |$)/$1.2/g;
印刷品;
}
我通常的方法是处理参数并将文件保存在临时列表中,然后将它们塞回@ARGV
my @files;
foreach (@ARGV) {
... do something with each parm
else {
push @files,$_;
}
}
@ARGV=@files;
while (<>) {
...
实际上我已经考虑过这种方法了。但我认为我在使用菱形操作符时犯了错误。出于好奇,有没有一种方法可以做到这一点而不用先创建ARGV的副本?@GolamKawsar当然有。但没那么容易。您可以简单地写出进行就地完整编辑的代码。不过,我不确定这样做的目的是什么。@GolamKawsar unadarned
while()
的行为与所谓的“magicARGV
”文件句柄相关联,该文件句柄(毫不奇怪地基于其名称)与@ARGV
数组相连接。如果你想要一个,你需要使用另一个。另一种选择,正如@TLP所说的,是根本不要使用magic-ARGV
或$^I
,而是自己编写等价的代码。@Golam Kawsar,如果您想避免复制,请使用引用:my$orig\u ARGV=\@ARGV;本地@ARGV=请注意,这听起来像是“过早”的优化。但是在解析文件时,您不能访问参数。@TLP:没错。但幸运的是,在这种情况下,我不需要while块中的参数!我认为这是一个巧妙的方法@GolamKawsar它实际上与我的方法相同,除了使用local
创建@ARGV
的副本,而不是my
@TLP:除了此副本对您隐藏并且由Perl透明地处理之外:)
if (-f) {
push @files,$_;
next;
}