我是一个完整的perl新手,是运行一个perl脚本用perl5.10和得到这个警告:

$* 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;

多谢了,

  • Rory
有帮助吗?

解决方案

perlvar:

使用美元,*使用现代Perl,取代/s/m修饰符模式匹配。

如果你有访问的地方,在那里它是匹配的只是将它添加到结束:

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

如果你只有访问string,你可以环绕的表达

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

或在您的情况下:

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

其他提示

Perl5.8版本的perlvar:

设置为一个非零整数值的做 多线匹配在一串 [...]中使用美元,*被弃用 现代Perl,取代通过和 /m修饰符模式匹配。

虽然使用/s/m要好得多,需要设置改性剂(适当!) 对于每一个经常的表达。

perlvar还说 "这种变量的影响的解释只^美元." 它给人的印象是,它是相当于/m只和不/s。

注意, $* 是一个全球性的变量。因为改变它不是本地的 local 关键词,这会影响 所有 经常表达的程序,而不仅仅是那些按照它的区块。这将使它更难以更新的剧本正确。

perldoc perlvar:

$*

设置为一个非零整数值的做多线匹配内string,0(或未定义)要告诉Perl,它可以假设那串包含一个单一的线,目的是优化模式相匹配。模式匹配上串含有多种内容的行可产生令人困惑的结果时, $* 是0或不确定的。默认是不确定的。(记忆: * 匹配多的事情。) 这个变量的影响的解释只 ^$.文字newline可以搜查,甚至时 $* == 0.

使用 $* 使用现代Perl,取代了通过 /s/m 修饰符模式匹配。

分配一个非数字值 $* 触发警告(和使 $* 采取行动,如果 $* == 0),而分配的一个数值来 $* 使得这一个隐含的int应用上的价值。

它基本上是一种说法,在随后的regex(s///或m//),^or$断言,应该能够匹配之前或之后新行嵌入串。

建议相当于是m modifier在你regex(例如,s/ ((\w*-*.*\w*/*)+:)/$1/gm;).

事实证明在多行模式。由于perl5.0(1994年)中,正确的方式做到这一点是增加一个 m 和/或 s 改你的regexp,像这样

 s/\n?Project.*rebuilt\.//msg
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top