题
我是一个完整的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;
其他提示
设置为一个非零整数值的做 多线匹配在一串 [...]中使用美元,*被弃用 现代Perl,取代通过和 /m修饰符模式匹配。
虽然使用/s/m要好得多,需要设置改性剂(适当!) 对于每一个经常的表达。
perlvar还说 "这种变量的影响的解释只^美元." 它给人的印象是,它是相当于/m只和不/s。
注意, $*
是一个全球性的变量。因为改变它不是本地的 local
关键词,这会影响 所有 经常表达的程序,而不仅仅是那些按照它的区块。这将使它更难以更新的剧本正确。
$*
设置为一个非零整数值的做多线匹配内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