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

使用它的两个代码片段是:

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

perlvar 的 Perl 5.8 版本

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

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

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

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

于 2008-09-17T23:04:15.600 回答
4

perldoc perlvar

$*

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

在现代 Perl 中不推荐使用 of $*,取而代之的是模式匹配中的/sand/m修饰符。

Assigning a non-numerical value to $* triggers a warning (and makes $* act as if $* == 0), while assigning a numerical value to $* makes that an implicit int is applied on the value.

于 2008-09-17T23:11:00.323 回答
1

它打开多行模式。自 perl 5.0(从 1994 年开始)以来,正确的方法是将 am和/或s修饰符添加到您的正则表达式中,如下所示

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

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

推荐的等效项是正则表达式末尾的 m 修饰符(例如,s/\n((\w*-*.*\w*/*)+:)/$1/gm;)。

于 2008-09-17T23:07:20.410 回答