7

私は完全な perl 初心者です。perl 5.10 を使用して perl スクリプトを実行していて、次の警告が表示されます。

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

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

私が実行しているスクリプトは、ソース コード データベースを vss から svn に移行するためのもので、ここにあります: http://www.x2systems.com/files/migrate.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;

どうもありがとう、

  • ロリー
4

5 に答える 5

13

perlvarから:

$* の使用は最新の Perl では推奨されておらず、パターン マッチングの /s および /m 修飾子に取って代わられています。

一致している場所にアクセスできる場合は、最後に追加してください。

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

文字列にしかアクセスできない場合は、式を次のように囲むことができます

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

またはあなたの場合:

s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;
于 2008-09-17T23:04:49.590 に答える
4

perldoc perlvarから:

$*

パターンマッチを最適化する目的で、文字列が単一行を含むと想定できることを Perl に伝えるには、文字列内で複数行のマッチングを行うためにゼロ以外の整数値に設定します。複数の改行を含む文字列でのパターン マッチは、$*が 0 または未定義の場合、紛らわしい結果を生成する可能性があります。デフォルトは未定義です。(記憶法:複数のものに一致します。) この変数は、と*のみの​​解釈に影響します。の場合でも、リテラル改行を検索できます。^$$* == 0

の使用は最新の Perl では推奨されておらず、パターン マッチングのand修飾子に$*取って代わられています。/s/m

数値以外の値を に割り当てる$*と、警告がトリガーされます (そして、 のように$*動作します$* == 0)。数値を に割り当てると、値に$*暗黙的な int が適用されます。

于 2008-09-17T23:11:00.323 に答える
4

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

文字列内で複数行のマッチングを行うには、ゼロ以外の整数値に設定します [...] $* の使用は、最新の Perl では推奨されておらず、パターン マッチングの /s および /m 修飾子に取って代わられています。

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

perlvar はまた、「この変数は ^ と $ のみの解釈に影響を与える」とも述べています。これは、/s ではなく /m のみと同等であるという印象を与えます。

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

于 2008-09-17T23:04:15.600 に答える
1

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

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

于 2008-09-17T23:07:20.410 に答える
1

複数行モードをオンにします。perl 5.0 (1994 年以降) から、これを行う正しい方法は、次のようにmand/ors修飾子を正規表現に追加することです。

 s/\n?Project.*rebuilt\.//msg
于 2008-09-17T23:02:14.947 に答える