Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl';就地编辑目录中的多个文件;s菱形和在位编辑操作符_Perl - Fatal编程技术网

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

使用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; 印刷品; } 这是完美的工作,做的工作,我需要它

我尝试使用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;
印刷品;
}
这是完美的工作,做的工作,我需要它做。但是,如果我的@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()
的行为与所谓的“magic
ARGV
”文件句柄相关联,该文件句柄(毫不奇怪地基于其名称)与
@ARGV
数组相连接。如果你想要一个,你需要使用另一个。另一种选择,正如@TLP所说的,是根本不要使用magic-
ARGV
$^I
,而是自己编写等价的代码。@Golam Kawsar,如果您想避免复制,请使用引用:
my$orig\u ARGV=\@ARGV;本地@ARGV=local
创建
@ARGV
的副本,而不是
my
@TLP:除了此副本对您隐藏并且由Perl透明地处理之外:)
if (-f) {
    push @files,$_;
    next;
}