0

文字列を別の文字列に置き換えようとしていますが、貪欲な性質がうまく機能していないようです。以下は、「PERFORM GET-APLCY」が識別されて適切に置き換えられた私のコードですが、文字列「PERFORM GET-APLCY-SOI-CVG-WVR」および他の多くのそのような文字列は、「PERFORMGET-APLCY」の置換文字列に置き換えられています"。

s/PERFORM $func[$i]\.*/#  PERFORM $func[$i]\.\n $hash{$func[$i]}/g;

文字列の一致および置換中は終止符はオプションです。また、一致するパターンを$ func [$ i]\bとして指定してみました。問題が何であるかを理解するのを手伝ってください。

よろしくお願いします、Faez

4

4 に答える 4

1

ドットがオプションの場合、なぜGET-APLCY-一致しないのですか?GET-APLCY.

簡単な解決策:配列を長さの降順で並べ替えます。

@func = sort { length $b <=> length $a } @func

テストスクリプト:

#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';

my %hash = ('GET-APLCY'              => 'REP1',
            'GET-APLCY-SOI-CVG-WVR'  => 'REP2',
            'GET-APLCY-SOI-MNG-CVRW' => 'REP3',
           );

my @func = sort { length $b <=> length $a } keys %hash;

while (<DATA>) {
    chomp;
    print;
    print "\t -> \t";
    for my $i (0 .. $#func) {
        s/$func[$i]/$hash{$func[$i]}/;
    }
    say;
}

__DATA__
GET-APLCY param
GET-APLCY- param
GET-APLCY. param
GET-APLCY-SOI. param
GET-APLCY-SOI-CVG-WVR param
GET-APLCY-SOI-MNG-CVRW param
于 2012-09-04T09:45:09.613 に答える
1

関数名をループしてs///、それぞれを呼び出しているようです。別の方法は、オプションを使用して、eそれらすべてを一度に(ループなしで)実行することです。

my %hash = (
  'GET-APLCY'             => 'replacement 1',
  'GET-APLCY-SOI-CVG-WVR' => 'replacement 2',
);

s{ 
  PERFORM \s+   # 'PERFORM' keyword 
  ([A-Z-]+)     # the original function name
  \.?           # an optional period
}{
  "#  PERFORM $1.\n" . $hash{$1};
}xmsge;

これeにより、置換パーツが式として評価されます。基本的に、最初の部分はすべてのPERFORM呼び出しを検索します(関数名はすべて大文字で、間に「-」が含まれていると想定しています。それ以外の場合は調整してください)。2番目の部分は、その行を表示するテキストに置き換えます。

xまた、、、、mおよびオプションを使用しましたs。これにより、正規表現でのコメントが可能になります。これらについて詳しくは、をご覧くださいperldoc perlop

s-lineのプレーンバージョンは次のようになります。

s/PERFORM ([A-Z-]+)\.?/"#  PERFORM $1.\n" . $hash{$1}/eg;
于 2012-09-04T12:33:24.410 に答える
0

$ func[$i]には「GET-APLCY」が含まれていると思います。その場合、これは、星がドットにのみ適用され、実際のドットにのみ適用され、「任意の文字」には適用されないためです。試す

s/PERFORM $func[$i].*/#  PERFORM $func[$i]\.\n $hash{$func[$i]}/g;
于 2012-09-04T09:50:55.180 に答える
0

$iに対してある種のループを実行しようとしていると確信しています。その場合、おそらくGET-APLCYはGET-APLCY-SOI-CVG-WVRの前の@func配列にあります。したがって、ループに入る前に@funcを逆ソートすることをお勧めします。

于 2012-09-04T21:20:09.320 に答える