On 8/27/07, Mihir Kamdar <[EMAIL PROTECTED]> wrote: > > > On 8/27/07, Chas Owens <[EMAIL PROTECTED]> wrote: > > On 8/27/07, Mihir Kamdar <[EMAIL PROTECTED]> wrote: > > snip > > > for my $len (reverse > $shortest .. $longest) { > > > my $key = substr > $cdr[3],0,$len; > > > last if $rate = > $prefix_to_rate{$key}; > > > if (defined > $rate) { > > > $cdr[13] > =($cdr[6]/20)*$rate ; > > > } > > > } > > snip > > > > The last will execute if $rate is set, so the "if (defined" will never > > be true (unless rate is 0, which I would assume is an error). You > > either need to move the "if (defined" outside of the for loop or you > > need to change the "last if" to > > > > if (exists $prefix_to_rate{$key}) { > > $cdr[13] = $cdr[6]/20*$prefix_to_rate{$key}; > > last; > > } > > > > Also, you need to work on your indenting. It is all over the place > > (which is probably why your if statement is in the wrong place). You > > might consider installing perltidy and running it on your code. > > > Hi Chas, > > I modified it like below:- > > while ($line=readline($IN_FILE)) > { > my @cdr=split (/,/, $line) ; > my $rate; > if($cdr[22] eq "Budget-IDD" ) > { > for my $len (reverse $shortest .. $longest) > { > my $key = substr $cdr[3],0,$len; > last if $rate = $prefix_to_rate{$key}; > } > if (defined $rate) > { > $cdr[13] = ($cdr[6]/20)*$rate ; > } > } > $line = join(",",@cdr); > [EMAIL PROTECTED],3,6,7]}=$line; > } > close $IN_FILE ; > > > Still not getting the result? > > Thanks.. >
#!/usr/bin/perl use strict; use warnings; Off hand I would say the problem is in your hash key. The following outputs data as I would expect. Let me know where/if it differs from what you want. my %prefix_to_rate = ( '+1' => 0.20, '+65' => 0.30, '+673' => 0.45, '+86' => 0.45, '+852' => 0.45, '+853' => 0.45, '+66' => 0.45, '+212' => 1.50, '+234' => 1.50, '+47' => 1.50, '+48' => 1.50, '+7' => 1.50, '+27' => 1.50, '+46' => 1.50, '+380' => 1.50, '+93' => 1.50, '+62' => 0.22 ); my ( $shortest, $longest ) = ( sort { $a <=> $b } map { length } keys %prefix_to_rate )[ 0, -1 ]; my %hash; while ( my $line = <> ) { my @cdr = split( /,/, $line ); my $rate; if ( $cdr[22] eq "Budget-IDD" ) { for my $len ( reverse $shortest .. $longest ) { my $key = substr $cdr[3], 0, $len; last if $rate = $prefix_to_rate{$key}; } if ( defined $rate ) { $cdr[13] = ( $cdr[6] / 20 ) * $rate; } } $line = join ',', @cdr; $hash{join ',', @cdr[2,3,6,7]} = $line; } print $hash{$_} for sort keys %hash; -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/