$*=1 を代替に置き換える方法 $* はサポートされなくなりました

StackOverflow https://stackoverflow.com/questions/88518

  •  01-07-2019
  •  | 
  •  

質問

私は Perl の全くの初心者で、Perl 5.10 を使用して Perl スクリプトを実行しているところ、次の警告が表示されます。

$* is no longer supported at migrate.pl line 380.

$* が何をしていたのか、そして現在推奨されている $* の置き換えについて説明できる人はいますか?あるいは、これについて説明しているドキュメントを教えていただければ幸いです。

私が実行しているスクリプトは、ソース コード データベースを vss から svn に移行するもので、ここにあります。http://www.x2systems.com/files/maigrate.pl.txt

これを使用する 2 つのコード スニペットは次のとおりです。

    $* = 1;
    $/ = ':';

    $cmd = $SSCMD . " Dir -I- \"$proj\"";
    $_ = `$cmd`;

    # what this next expression does is to merge wrapped lines like:
    #    $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/excep
    #    tion:
    # into:
    #    $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/exception:
    s/\n((\w*\-*\.*\w*\/*)+\:)/$1/g;

    $* = 0;

そして、後でいくつかの方法で:

            $cmd = $SSCMD . " get -GTM -W -I-Y -GL\"$localdir\" -V$version \"$file\" 2>&1";
            $out = `$cmd`;

            # get rid of stupid VSS warning messages
            $* = 1;
            $out =~ s/\n?Project.*rebuilt\.//g;
            $out =~ s/\n?File.*rebuilt\.//g;
            $out =~ s/\n.*was moved out of this project.*rebuilt\.//g;
            $out =~ s/\nContinue anyway.*Y//g;
            $* = 0;

どうもありがとう、

  • ロリー
役に立ちましたか?

解決

から ペルヴァール:

$* の使用は最新の Perl では非推奨であり、パターン マッチングの /s および /m 修飾子に置き換えられています。

一致する場所にアクセスできる場合は、それを末尾に追加するだけです。

 $haystack =~ m/.../sm;

文字列のみにアクセスできる場合は、式を次のように囲むことができます。

 qr/(?ms-ix:$expr)/;

またはあなたの場合:

s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;

他のヒント

から perlvar の Perl 5.8 バージョン:

ゼロ以外の整数値に設定して、文字列[...] $*の使用を行うように設定されています。

/s と /m を使用する方がはるかに優れていますが、正規表現ごとに修飾子を (適切に) 設定する必要があります。

ペルヴァールも言う 「この変数は ^ と $ の解釈にのみ影響します。」 これは、/s ではなく /m のみと同等であるという印象を与えます。

ご了承ください $* はグローバル変数です。それへの変更はローカルに行われないため、 local キーワード、影響します 全て ブロック内でその後に続く正規表現だけでなく、プログラム内の正規表現も同様です。これにより、スクリプトを正しく更新することがより困難になります。

から perldoc ペルバール:

$*

文字列内で複数行のマッチングを行う場合は 0 (または未定義) 以外の整数値に設定し、パターン マッチングを最適化する目的で文字列に 1 行が含まれると想定できることを Perl に指示します。複数の改行を含む文字列のパターン マッチは、次の場合に混乱を招く結果を引き起こす可能性があります。 $* 0または未定義です。デフォルトは未定義です。(ニモニック: * 複数のものに一致します。) この変数は、次の解釈のみに影響します。 ^ そして $. 。リテラル改行は次の場合でも検索できます。 $* == 0.

の使用 $* 最新の Perl では非推奨となり、 /s そして /m パターンマッチングの修飾子。

数値以外の値を代入する $* 警告をトリガーします(そして $* あたかものように行動する $* == 0)に数値を代入しながら、 $* 暗黙的な int が値に適用されるようにします。

これは基本的に、後続の正規表現 (s/// または m//) で、^ または $ アサーションが文字列に埋め込まれた改行の前後に一致できる必要があることを示す方法でした。

推奨される同等の修飾子は、正規表現の末尾にある m 修飾子です (例: s/ ((\w*-*.*\w*/*)+:)/$1/gm;)。

複数行モードをオンにします。perl 5.0 (1994 年以降) 以降、これを行うための正しい方法は、 m および/または s このように正規表現に修飾子を追加します

 s/\n?Project.*rebuilt\.//msg
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top