in reply to Re^2: printf syntac
in thread printf syntac

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

Replies are listed 'Best First'.
Re^4: printf syntac
by props (Hermit) on Sep 29, 2007 at 09:48 UTC
    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

        Many thanks FunkyMonk I had not a clue how to do it
      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;