in reply to Filter out an input file with a given waiver file, and output to a specific file

#! /tools/perl/5.8.8/linux/bin/perl use strict; use warnings; # Set up a hash to receive the information my %identifier = (); # Read the violations file into the hash open my $filter, '<', $waiver or die; while (my $vline = <$filter>) { my ($pins2, $threshold2, $newthreshold2, $note1, $note2, $note3, $ +note4, $note5) = split /\s+/, $vline; #$identifier{$pins2}{threshold2} = $threshold2; $identifier{$pins2}{newthreshold2} = $newthreshold2; } #Read input file line by line open my $input, '<', $report or die; open my $output, '>', $result or die; while (my $wline = <$input>){ my ($scenario, $pins1, $threshold1, $newthreshold1, $diff, $status +) = split /\s+/, $wline; print $output "$scenario $pins1 $threshold1 $newthreshold +1 $diff $status\n"; foreach my $okey (keys %identifier) { foreach my $skey (keys %{$identifier{$okey}}) { if (exists $identifier{$okey}) { #my $diff2 = $skey - $threshold1; print $output "$scenario $pins1 $threshold1 $skey +$diff (WAIVED)\n"; } } } } close $filter; close $input; close $output;

guys, i still have some problems with this code, anyone has any ideas? Basically, my waiver file won't be larger tan input file, and i want the output format same as input file, just watever mention inside the waiver file, the fourth column value chg to waiver file value, and the status chg from "violated" to "waived"

  • Comment on Re: Filter out an input file with a given waiver file, and output to a specific file
  • Download Code

Replies are listed 'Best First'.
Re^2: Filter out an input file with a given waiver file, and output to a specific file
by poj (Abbot) on Jul 13, 2017 at 07:03 UTC

    No need to loop through the hash keys to find a match

    foreach my $okey (keys %identifier) {
       foreach my $skey (keys %{$identifier{$okey}}) {
         if (exists $identifier{$okey}) {
    

    Try

    #!/tools/perl/5.8.8/linux/bin/perl use strict; use warnings; use Data::Dumper; my $report ="/ice_pnr/pnr19/nadder/lzhong/uibnd4h/lzhong.i14socnd.uibn +d4h.44/uibnd4h/r2g2/blocks/INTEL14.P1273.6/uibnd4h_bot_sta/40_finish/ +tmp/trans10/max_trans_summary.list"; my $waiver = "/home/leeyong1/waiver.csv"; my $result = "/home/leeyong1/output.file"; print "script -report ($report) -waiver ($waiver) -output ($result)\n" +; # Read the violations file into the hash #klmn124,100.00,2500.00,"justifiedbyChan","Date:14/4" my %identifier = (); open my $filter, '<', $waiver or die "$!"; while (my $vline = <$filter>) { next unless $vline =~ /\S/; # skip blank lines my ($pin, $t1, $t2, @note) = split /,/, $vline; $identifier{$pin}{'t1'} = $t1; $identifier{$pin}{'t2'} = $t2; } print Dumper \%identifier; #Read input file line by line open my $input, '<', $report or die "$!"; open my $output, '>', $result or die "$!"; #abcd123 klmn123 100.00 1000.00 -900.00 (VIOLATED) while (my $wline = <$input>){ my ($scenario, $pin, $t1, $t2, $diff, $status) = split /\s+/, $wline +; # overwrite values if match if (exists $identifier{$pin}) { $t1 = $identifier{$pin}{'t1'}; $t2 = $identifier{$pin}{'t2'}; $diff = sprintf "%.2f",$t1-$t2; $status = '(WAIVED)'; } print $output "$scenario $pin $t1 $t2 $diff $status\n"; } close $filter; close $input; close $output;
    poj
      in this line and loop, Global symbol "$pins2" requires explicit package name, for both $pin and $identifier

      Update:

      if (exists $identifier{$pin}) {

      in this line and loop, Global symbol "$pin" requires explicit package name, for both $pin and $identifier

      2017-07-15 Athanasius restored original content

        Gee that's funny, i dont see $pins2 anywhere in that code. And trying to run it produces no messages to that effect

        You must have done something really wrong, what was it?

        Maybe you could first take the time to compare what you have to what poj wrote for you

        Did you copy-and-paste the program, or did you retype?
        I usually get this kind of message, when I accidentally forget semicolons and Perl then sees the "if" as a statement modifier.