-1

私は Perl の完全な新人です。私がやろうとしているのは、ファイルのリストを開き、各ファイルで 3 つの異なる変数をインクリメントし、ファイルを保存して閉じることです。

変数は次のようになります

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;

私を始めてくれたボロディンに感謝しますTie::File:それは間違いなく役に立ちました。

while ループを使用した 2 番目のソリューション

#!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

あなたの「whileループを使用した2番目のソリューション」には多くの問題があります。

  • use strictプログラムを機能させるために無効にしないでください。コード内の問題を隠すだけです

  • 未使用のサブルーチンincと未使用の変数があります$i

  • open、およびレキシカル ファイル ハンドルの 3 つのパラメータ形式を常に使用する必要があります。

  • 置換を適用する前に、行に文字列が含まれているかどうかをテストする必要はありません

  • 値を割り当ててインクリメントする($2+1)のではなく、単に置換文字列で使用できます$_++($_=$2)

  • ファイルから読み取った行に名前付き変数を使用する場合は、通常、while (my $string = <$fh>) {...}. このような短いブロックの場合は、使用するだけの方が良いです$_

  • chomp各行の後に追加のスペースと改行を出力することを除いて、入力は問題ありません

  • print "$string \n"コードに2回あります。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 に答える
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 に答える