在编写脚本时,我注意到一些非常奇怪的Perl行为。任务是修剪$temp1
变量中存储的字符串的最后一个字符,这可以使用chop($temp1)
或更复杂的substr($temp1, 0, length($temp1) - 1)
来完成。这些都作为单行工作,但在我的脚本中,substr
解决方案不起作用。以下是调试器的示例:
main::(delmid_n.pl:24): if (($state == 0) && ($_ !~ $musr) && ($_ !~ $lusr)) {
>> n
main::(delmid_n.pl:54): $strprn=substr($temp1, 0, length($temp1) - 1);
>> p $temp1
(-,user2,t-mobile.co.uk)\
>> p substr($temp1, 0, length($temp1) - 1) . "\n";
(-,user2,t-mobile.co.uk)
DB<4>
main::(delmid_n.pl:55): print $strprn . "\n";
DB<4>
main::(delmid_n.pl:56): $temp1 = "";
DB<4>
正如您在$strprn
变量中看到的,没有任何内容存储。如果通过'p'命令打印同一段代码(存储在$strprn
变量中),则输出正常。使用上面提到的chop()
函数可以克服这个“错误”(参见下面的代码):
main::(delmid_w.pl:24): if (($state == 0) && ($_ !~ $musr) && ($_ !~ $lusr)) {
>> p $temp1
(-,user2,t-mobile.co.uk)\
DB<4> n
main::(delmid_w.pl:56): chop ($temp1);
DB<4> n
main::(delmid_w.pl:57): print $temp1;
DB<4> n
(-,user2,t-mobile.co.uk)
main::(delmid_w.pl:58): $temp1 = "";
DB<4>
上面的代码与第一个示例完全相同,但以下两行来自第一个示例:
$strprn=substr($temp1, 0, length($temp1) - 1);
print $strprn . "\n";
在第二个例子中,被以下两行代替:
chop ($temp1);
print $temp1;
第二种解决方案有什么问题?
到目前为止,这是一个我没有解决方法的问题。
DB<1>
main::(delbeg_n.pl:15): $state = 0;
DB<1>
main::(delbeg_n.pl:16): $muser = qr/\(-,user1,[^,]+\.co\.uk\)\\$/;
DB<1>
main::(delbeg_n.pl:19): line: while (<>) {
DB<1>
main::(delbeg_n.pl:20): chomp; # strip record separator
DB<1>
main::(delbeg_n.pl:21): @Fld = split(/\s+/, $_,);
DB<1>
main::(delbeg_n.pl:23): if (($state == 0) && ($Fld[1] =~ $muser)) {
DB<1> p $Fld[1]
(-,user1,one2one.co.uk)\
DB<2> n
main::(delbeg_n.pl:43): print $_;
DB<2> p $_
netgroup1 (-,user1,one2one.co.uk)\
DB<3> if ($Fld[1] =~ $muser) {print "TRUE"}
TRUE
正如您在代码中执行第21行后所看到的,下一个执行行是43(else语句)。为什么以下条件未被评估为真,允许代码继续第23,24,25行?
if (($state == 0) && ($Fld[1] =~ $muser))
插入以下行作为示例,应将条件评估为true:
if ($Fld[1] =~ $muser) {print "TRUE"}
非常感谢。
答案 0 :(得分:1)
这两个问题都是相关的。在行尾有一些奇怪的东西。
首先,看起来好像你在线路末尾的斜线后面有一个换行符,你没有选择 - 至少这是调试器显示的内容:
>> p $temp1
(-,user2,t-mobile.co.uk)\
DB<4> n
如果没有新行,那就是
>> p $temp1
(-,user2,t-mobile.co.uk)\
DB<4> n
因此,应该有两个字符:\
和换行符。
为什么这种奇怪的行为 - 我不知道你不知道你的输入文件。
此外,您不必使用字符串长度,而只需执行substr( $string, 0, -1 )
- 它也会返回除最后一个字符之外的所有字符。
这可能是您遇到第二个问题的原因 - 我猜\(-,user1,[^,]+\.co\.uk\)\\
匹配并且它是行标记$
的结尾导致不匹配。
use strict
请