Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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以增量方式替换同一行中的数字_Perl - Fatal编程技术网

使用Perl以增量方式替换同一行中的数字

使用Perl以增量方式替换同一行中的数字,perl,Perl,我有一些这样的XML数据 <!--Q1: some text--><!--Q1: some text--><!--Q1: some text--> s/(<!--Q)\d+/$1.++$n/ge; 我想按这样的顺序替换这个查询号 <!--Q1: some text--><!--Q2: some text--><!--Q3: some text-->.. 。。 我写了这个Perl脚本 #!/usr/bin/p

我有一些这样的XML数据

<!--Q1: some text--><!--Q1: some text--><!--Q1: some text-->
s/(<!--Q)\d+/$1.++$n/ge;

我想按这样的顺序替换这个查询号

<!--Q1: some text--><!--Q2: some text--><!--Q3: some text-->..
。。
我写了这个Perl脚本

#!/usr/bin/perl -w
$b=1;
use strict;
open(FILE, "<text.xml") || die "File not found";
my @lines = <FILE>;
close(FILE);
my @newlines;
while<> { 
    $_ =~ s/<!--Q[0-9]{1,2}/<!--Q$b/g;
    $b++;
    push(@newlines,$_);
}
open(FILE, ">text.xml") || die "File not found";
print FILE @newlines;
#/usr/bin/perl-w
$b=1;
严格使用;

打开(文件“您的程序有许多问题

  • 必须始终
    使用strict
    使用warnings
    作为程序的第一行

  • 您应该使用词汇文件句柄(标量变量)而不是全局名称

  • 如果
    open
    失败,则应使用
    open
    的三参数形式,并在
    die
    字符串中包含内置变量
    $!

  • 千万不要使用
    $a
    $b
    作为变量名。它们根本无助于记录程序,perl在内部使用它们,因此不能依赖它们的内容

  • 您已将整个文件读取到
    @行中
    ,然后希望在
    while
    循环中可以读取更多内容。您已经到达了文件的末尾,因此不会进入循环

  • 
    

    更新

    如果您没有可用的Perl5版本10(而且您真的应该——它已经有六年的历史了,并且是一个主要的更新),那么您可以这样编写正则表达式

    <!--Q1: some text--><!--Q1: some text--><!--Q1: some text-->
    
    s/(<!--Q)\d+/$1.++$n/ge;
    

    s/(@Kenosis:诡异:我以为那是一个工作程序的直接复制/粘贴。我想我在上次运行后对它进行了修补。感谢您的帮助。非常欢迎。只返回您给我的一点帮助。如何为文件夹中的所有*.xml文件运行此脚本?
    
    <!--Q1: text-->
    <!--Q2: text--><!--Q3: text-->
    <!--Q4: text--> 
    
    s/(<!--Q)\d+/$1.++$n/ge;