-1

我是 Perl 的新手。我要做的是打开一个文件列表,在每个文件中增加三个不同的变量,保存文件,然后关闭。

变量看起来像这样

This_Is_My_Variable03
This_Is_My_Variable02
This_Is_My_Variable01

以 01 结尾的变量在文件中多次出现。变量有时是字符串的一部分。变量的This_Is_My_Variable部分永远不会改变。

谢谢。

这可能不是最好的解决方案,但它有效

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl

use warnings;
use strict;

use Tie::File;

tie my @data, 'Tie::File', 'myfile.txt' or die $!;

s/(This_Is_My_Variable)(\d+)+/$1.++($_=$2)/eg for @data;

untie @data;

感谢 Borodin 让我开始Tie::File:这绝对有帮助。

使用while循环的第二种解决方案

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl
use warnings;

#use strict;

sub inc {
    my ($num) = @_;
    ++$num;
}

open(FILE, "myfile.txt") || die $!;
$i = 0;
while (<FILE>) {
    $string = $_;
    if (/This_Is_My_Variable../) {
        $string =~ s/(This_Is_My_Variable)(\d+)+/$1.++($_=$2)/eg;
        print "$string \n";
        $i++;
    }
    else {
        print "$string \n";
    }
}

close FILE;
4

2 回答 2

1
use strict;
use warnings;

use Tie::File;

tie my @data, 'Tie::File', 'myfile' or die $!;

s/(\d+)$/sprintf '%02d', $1+1/e for @data;
于 2013-04-06T01:40:48.397 回答
1

您的“使用 while 循环的第二种解决方案”存在许多问题。

  • 永远不要禁用use strict以使程序正常工作。所做的只是隐藏代码中的问题

  • 您有一个未使用的子程序inc和一个未使用的变量$i

  • open您应该始终使用, 和词法文件句柄的三参数形式

  • 在应用替换之前无需测试该行是否包含字符串

  • 您可以简单地($2+1)在替换字符串中使用,而不是将值分配给$_并使用++($_=$2)

  • 如果您打算对从文件中读取的行使用命名变量,那么通常您应该使用while (my $string = <$fh>) {...}. 对于像这样的短块,最好只使用$_

  • 你没有chomp输入,这很好,除非你在每行之后打印一个额外的空格和换行符

  • print "$string \n"的代码中有两次。if它也可能只在结构外出现一次

此代码执行相同的过程。我希望它有所帮助。

use strict;
use warnings;

open(my $fh, '<', 'myfile.txt') || die $!;
while (<$fh>) {
    s/(This_Is_My_Variable)(\d+)/$1.($2+1)/eg;
    print;
}
于 2013-05-21T09:29:06.810 回答