in reply to Re^2: Loop, but print once.
in thread Loop, but print once.

I don't think you get the intended result for
1 300 1_a 30 1_b 20 1 300 2_a 22 2_b 12 1 320 1_a 10 1_b 30 1 320 2_a 32 2_b 22 2 320 1_a 31 1_b 20 2 320 2_a 21 2_b 12

It gives
2 -     1_a 31 1_b 20
where I'd expect
2 - 320 1_a 31 1_b 20

Also, there's usually a desire to only omit repeated header fields, yet your solution can omit any number of fields, even all of them.

Fix:

use strict; use warnings; my $PRINTF = '%3s %3s %s %s %s %s'; my $HEADERS = 2; my @prev_cells; while (<DATA>) { # Input data. my @cells = split /\t/, $_; # Format the data for printing. $cells[0] .= ' -'; # Remove redundant headers. my @display_cells = @cells; if (@prev_cells) { for (@display_cells[ 0 .. $HEADERS-1 ]) { last if $_ ne shift @prev_cells; $_ = ''; } } @prev_cells = @cells; # Output data. printf $PRINTF, @display_cells; } __DATA__ 1 300 1_a 30 1_b 20 1 300 2_a 22 2_b 12 1 320 1_a 10 1_b 30 1 320 2_a 32 2_b 22 2 320 1_a 31 1_b 20 2 320 2_a 21 2_b 12 2 320 2_a 33 2_b 44
1 - 300 1_a 30 1_b 20 2_a 22 2_b 12 320 1_a 10 1_b 30 2_a 32 2_b 22 2 - 320 1_a 31 1_b 20 2_a 21 2_b 12 2_a 33 2_b 44

Replies are listed 'Best First'.
Re^4: Loop, but print once.
by Narveson (Chaplain) on Mar 07, 2008 at 06:24 UTC

    You're right. Thanks.

    I feel honored to have my submission reviewed so thoroughly.

    The one change I fail to see the motive for is the decision not to initialize @prev_cells when it is declared, but instead to test for its existence on every pass through the loop.

      Mostly 'cause I didn't notice you initialized @prev_cells until after I already had the if in place. :) I have no problem with how you did that. (Mind you, $SPACE works just as well as the empty string.)