我是一个完整的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;
非常感谢,
答案 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)
$*
设置为非零整数值以在字符串中进行多行匹配,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;)。