splatohara has asked for the wisdom of the Perl Monks concerning the following question:

I have a script reading from a file that should return a string when it comes across a certain value in an array created in the script using data from the file but it does not seem to be working as it should an array is created from a file containing below
x.x.nas.6.9.1.1.40.1001 = 1134468706 x.x.nas.6.9.1.1.14.1001 = 9 x.x.nas.6.9.1.1.13.1001 = 16 x.x.nas.6.9.1.1.12.1001 = 16 x.x.nas.6.9.1.1.40.1001 = 1134468706 x.x.nas.6.9.1.1.14.1001 = 34 x.x.nas.6.9.1.1.13.1001 = 19 x.x.nas.6.9.1.1.12.1001 = 30 x.x.nas.6.9.1.1.40.1001 = 1134485731 x.x.nas.6.9.1.1.14.1001 = 45 x.x.nas.6.9.1.1.13.1001 = 16 x.x.nas.6.9.1.1.12.1001 = 16 x.x.nas.6.9.1.1.40.1001 = 1134485731 x.x.nas.6.9.1.1.x.x = 9 #!/perl/bin open (In,"tasco2.log") or die ("can not open file "); open (Out,">tasfinrpt.txt") or die ("cannot open output file maybe you + should create one"); #print "\n\n Session id Modulation \n\n"; #$firstlineFlag = 1; $sessid= 100; $modtyplast =1; $modtypv34 = "V34"; my $sessidlast ; while (my $line = ) { @temp = split (/[=]/, $line); if ($temp[1] > $sessid) { $sessid =$temp[1]; chomp $sessid; print "\n $sessid "; } if ($temp[1] < 100){ $modtyp = $temp[1]; } if ($modtyp ne $modtyplast&&($sessid ne $sessidlast)){{ print " "; if ($modtyp == 9){ print "no connect"; # goto $breakp; } if ($modtyp == 20) { print "V34"; } elsif($modtyp == 34){ print " V90 digital"; } if ($modtyp == 45){ print " V92 PCM Upstream"; } elsif ($modtyp == 44){ print " 50666bps"; } # elsif ($modtyp == 28){ # print " 29333bps\n "; # } elsif ($modtyp == 31){ print " 33333bps "; } elsif ($modtyp == 18){ print "21Kbps "; } # elsif ($modtyp == 21){ # print " 28Kbps"; # } elsif ($modtyp == 43){ print " 49333\n"; } elsif ($modtyp == 39){ print "44Kbps\n"; } elsif ($modtyp == 40){ print "45333bps"; } } breakp: $modtyplast = $modtyp; $sessidlast = $sessid ; # } }
the results are as follows......I don't see why the last two values can not have a string returned for them
1134468706 no connect 1134485731 1134502756
The idea of the script is to create an array for each line in the file and then depending on whether is comes a cross an a different value for an element it either executes the next few lines of the script or reads in the next line of the file etc etc etc I have tried to break from the script if it came across the the same value and return to the top but could not get it working properly any ideas thanks /splat

Edit davorg: Added code tags

  • Comment on executing the following lines of a script if the value of an elemnt in an array changes
  • Select or Download Code

Replies are listed 'Best First'.
Re: executing the following lines of a script if the value of an elemnt in an array changes
by tachyon (Chancellor) on Apr 08, 2002 at 20:26 UTC

    Your code is pretty awful, as is your explanation of what you want to do. But as you have put in some effort....

    It is hard to know where to begin but I suggest you have a look at New Monks. Here is some code you should be able to get working much easier. It does roughly what you want (I think)

    #!/perl/bin -w use strict; # do you opens like this. no hard coded names. $! contains error messa +ges if # the open fails so print out perls helpful message # my $log = "tasco2.log"; # open LOG, $log or die "Can not open $log, Perl says the reason is $! +\n"; # define model types in a hash lookup table my %modhash = ( 9 => "no connect", 18 => "21000bps", 20 => "V34", 28 => "29333bps", 31 => "33333bps", 34 => "V90 digital", 39 => "44000bps", 40 => "45333bps", 43 => "49333bps", 44 => "50666bps", 45 => "V92 PCM Upstream", ); my $sessidlast = 0; my $newsession = 0; my $modtypelast = ''; while (my $line = <DATA> ) { chomp $line; my @temp = split /\s*=\s*/, $line; if ($temp[1] > 100) { # we have a session id my $sessid = $temp[1]; do { $newsession = 0; next } if $sessid == $sessidlast; $sessidlast = $sessid; $newsession = 1; print "\n$sessid\t"; } else { # we have a modtype next unless $newsession; # skip if we don't have a new session my $modtype = $temp[1]; next if $modtype == $modtypelast; $modtypelast = $modtype; print get_modtype($modtype), "\t"; } } sub get_modtype { my $modtype = shift; if (defined $modhash{$modtype}) { return $modhash{$modtype} . "\t"; } else { return "Unknown modtype $modtype!\t"; } } __DATA__ x.x.nas.6.9.1.1.40.1001 = 1134468706 x.x.nas.6.9.1.1.14.1001 = 9 x.x.nas.6.9.1.1.13.1001 = 16 x.x.nas.6.9.1.1.12.1001 = 16 x.x.nas.6.9.1.1.40.1001 = 1134468706 x.x.nas.6.9.1.1.14.1001 = 34 x.x.nas.6.9.1.1.13.1001 = 19 x.x.nas.6.9.1.1.12.1001 = 30 x.x.nas.6.9.1.1.40.1001 = 1134485731 x.x.nas.6.9.1.1.14.1001 = 45 x.x.nas.6.9.1.1.13.1001 = 16 x.x.nas.6.9.1.1.12.1001 = 16 x.x.nas.6.9.1.1.40.1001 = 1134485733 x.x.nas.6.9.1.1.x.x = 9

    cheers

    tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print