in reply to Re: printf syntac
in thread printf syntac

pen WRITEFILE , ">>$time.txt" or die "write error\n"; my $format = " %10s\n" x @totalexpenses . "%10s\n" x @totalcosts; printf WRITEFILE $format, @totalexpenses . @totalcosts;
I think those two @totalexpenses . @totalcosts conflict.

Replies are listed 'Best First'.
Re^3: printf syntac
by ikegami (Patriarch) on Sep 28, 2007 at 16:58 UTC

    Change
    printf WRITEFILE  $format, @totalexpenses . @totalcosts;
    back to
    printf WRITEFILE  $format, @totalexpenses, @totalcosts;

      Hi Monks i have 2 arrays @totalexpenses = "ONE" , "TWO" , "THREE"; and @totalcosts = "1" , "2" , "3"; by executing the following code i do not get the result i wish to have in WRITEFILE filehandler. gives me:
      ONE TWO THREE 1 2 3 but what i want to look like is : ONE 1 TWO 2 THREE 3
      do i need another loop or a hash to form the data ?
      open WRITEFILE , ">>$time.txt" or die "write error\n"; my $format = " %10s\n" x @totalexpenses . "%10s\n" x @totalcosts; printf WRITEFILE $format, @totalexpenses , @totalcosts; close WRITEFILE; }
        List::MoreUtils has a couple of functions that do what you want - pairwise and each_array
        use List::MoreUtils qw/pairwise each_array/; my @totalexpenses = qw/ ONE TWO THREE/; my @totalcosts = 1 .. 3; print "pairwise\n\n"; $a = $b = 0; # avoid "used only once" warnings print pairwise { sprintf "%10s %10s\n", $a, $b } @totalexpenses, @tota +lcosts; #or pairwise { printf "%10s %10s\n", $a, $b } @totalexpenses, @totalco +sts; print "\neach_array\n\n"; my $iter = each_array @totalexpenses, @totalcosts; while ( my ( $costs, $exp ) = $iter->() ) { printf "%10s %10s\n", $costs, $exp; }

        Output:

        pairwise ONE 1 TWO 2 THREE 3 each_array ONE 1 TWO 2 THREE 3

        update: added pairwise in void context alternative

        The solution with List::MoreUtils is definitely good. But sometimes (like when writing code that needs to run on lots of different machines), reliance on a non-core module can be less economical than we would like, especially when the task being solved by the module isn't that complicated to begin with.

        Here's the solution without the extra module:

        open WRITEFILE, ">>", "$time.txt" or die "$time.txt: $!"; my $format = " %10s %10s\n"; printf WRITEFILE $format, $totalexpenses[$_], $totalcosts[$_] for (0.. +$#totalcosts); close WRITEFILE;