Perl调试器的各种输出

时间:2012-10-09 22:21:15

标签: perl debugging

在编写脚本时,我注意到一些非常奇怪的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"}

非常感谢。

1 个答案:

答案 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
  • 检查文件类型(dos,unix,old mac)
  • 以十六进制编辑器查看文件