如何用替代现在$ *替换$ * = 1不再受支持

时间:2008-09-17 22:58:37

标签: perl migrate

我是一个完整的perl新手,使用perl 5.10运行perl脚本并收到此警告:

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

任何人都可以描述$ *做了什么以及现在建议更换它的是什么? 或者,如果您可以向我指出描述这一点的文档,那就太棒了。

我正在运行的脚本是将源代码数据库从vss迁移到svn,可以在这里找到: http://www.x2systems.com/files/migrate.pl.txt

使用它的两段代码是:

    $* = 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;
非常感谢,

5 个答案:

答案 0 :(得分:12)

来自perlvar

  

在现代Perl中不推荐使用$ *,在模式匹配上用/ s和/ m修饰符取代。

如果您可以访问匹配的位置,只需将其添加到结尾:

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

如果您只能访问该字符串,则可以使用

括起表达式
 qr/(?ms-ix:$expr)/;

或者在你的情况下:

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

答案 1 :(得分:4)

来自Perl 5.8 version of perlvar

  

设置为非零整数值   字符串中的多行匹配   [...]不推荐使用$ *   现代Perl,由/ s和。取代   / m模式匹配的修饰符。

使用/ s和/ m要好得多,你需要为每个正则表达式设置修饰符(适当!)。

perlvar还说“这个变量仅影响^和$的解释。”给人的印象是它只相当于/ m而不是/ s。

请注意$*是一个全局变量。由于对local关键字的更改不是本地的,因此会影响程序中的所有正则表达式,而不仅仅是在块中跟随它的那些正则表达式。这将使正确更新脚本变得更加困难。

答案 2 :(得分:3)

来自perldoc perlvar

  

$*

     

设置为非零整数值以在字符串中进行多行匹配,0(或未定义)告诉Perl它可以假定字符串包含单行,以优化模式匹配。当$*为0或未定义时,包含多个换行符的字符串上的模式匹配会产生令人困惑的结果。默认值未定义。 (助记符:*匹配多个内容。)此变量仅影响^$的解释。即使$* == 0,也可以搜索文字换行符。

     

现代Perl中不推荐使用$*,而/s/m修饰符取代了模式匹配。

     

$*分配非数字值会触发警告(并使$*表现得像$* == 0),同时为$*分配数值会使其成为{{1}}隐式int应用于值。

答案 3 :(得分:1)

打开多线模式。从perl 5.0开始(从1994年开始),正确的方法是在你的regexp中添加 m 和/或 s 修饰符,像这样

 s/\n?Project.*rebuilt\.//msg

答案 4 :(得分:1)

这基本上是一种说法,在后续的正则表达式(s ///或m //)中,^或$断言应该能够在字符串中嵌入的换行符之前或之后匹配。

建议的等价物是正则表达式末尾的m修饰符(例如,s / \ n((\ w * - *。* \ w * / *)+ :) / $ 1 / gm;)。