Hi gurus, during debugging script I noticed some very strange behavior. The 1st task is to trim last character of string stored in $temp1 variable, this can be done using either chop($temp1) or more complicated substr($temp1, 0, length($temp1) - 1). Those both codes works as oneliners but in my script the substr solution did not works. Bellow is example from debugger:


1st TASK:
=========

1st SOLUTION - DID NOT WORKING:
===============================

Code:
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>
As you can see in the $strprn variable nothing is stored but if the same piece of code (which is stored into $strprn variable) is printed via 'p' command the output is OK. This "bug" can be overcomed using mentioned chop() function, see code bellow:


2nd SOLUTION - WORKING:
=======================
Code:
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>

The above code is exactly the same as first example but following two lines from 1st example:

Code:
$strprn=substr($temp1, 0, length($temp1) - 1);
print $strprn . "\n";

are replaced with following two lines in 2nd example:

Code:
chop ($temp1);
print $temp1;

What is wrong with 2nd solution ?






2nd TASK:
=========
Second task is quiet simple matching the string against regexp, but it is not working for me:

Code:
  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
This is problem which I did not workaroud so far.


As you can see after executing line 21 in code the next execution line is 43 (the else statement). Why following condition is not evaluated as a true and code did not continues with line 23, 24, 25 ...

Code:
if (($state == 0) && ($Fld[1] =~ $muser))

Following line was inserted as a demonstration that condition should be evaluated as a true.

Code:
if ($Fld[1] =~ $muser) {print "TRUE"}

Thanks a lot.