in reply to Re^2: Can't use string as an ARRAY ref
in thread Can't use string as an ARRAY ref

It looks like you might be trying to construct a table, possibly in HTML. I would suggest looking into the CPAN modules for that purpose. They will dictate your data structure, at least to an extent.

Otherwise, what do you want the output to look like?

Dum Spiro Spero

Replies are listed 'Best First'.
Re^4: Can't use string as an ARRAY ref
by Anonymous Monk on Aug 21, 2015 at 15:40 UTC
    Its actually PDF.
    use PDF::API2; use PDF::Table;
    The issue is in the "for loop", cause if I just pass something like this out side of the "for loop" it goes wel:

    my $extra_data = $data->{$num}{extra}; unshift @$extra_data,["City", "Street", "ZIP"];
    I even tried passing this:
    add_more( data => $type->[$i], );
    as:
    add_more(data => @{ $type->[$i] }, );

    Course, it didn't work!

      Here is a working example for creating tables in PDF using your structures. I was not able to understand what the loop was for. Can you modify it to demonstrate the problem that you have ?.

      #!/usr/bin/perl use strict; use warnings; use PDF::API2; use PDF::Table; use Data::Dump 'pp'; my $data = { 1=>{ 'main' => [ [ '12345', 'MONICA', '01/01/1900','0X10' ], [ '000001', 'MARY L', '01/01/2000','0111P' ], [ '8884', 'JOHN M.','01/01/1932','0OK8' ],], 'type' => [ ['Main','1900','Red'], ['APT', '1290','Blue'], ['AVAL','1921','Green'],], 'princ' => [ ['Q3.0', 'OK','1900-01-01','N','O','O','X','Y'], ['12w','PL','2000-01-02','N','P','O','X','A'],], }}; my $pdftable = new PDF::Table; my $pdf = new PDF::API2( -file => "table.pdf" ); my $page = $pdf->page; $pdf->mediabox(842, 595); foreach my $num ( keys %{$data} ) { my $main = $data->{$num}{main}; unshift @$main,["Account", "Name", "Date", "Code #"]; #pp $main; my $type = $data->{$num}{type}; unshift @$type,["HOUSE", "YEAR", "COLOR"]; #pp $type; my $princ = $data->{$num}{princ}; unshift @$princ,["AC #","Name", "DATE", "Ref","Case #1","Case #2", " +Case #3", "Case #4"]; #pp $princ; #for my $i ( 0 .. $#{ $main } ){ # more stuff my $y = 500; (undef,undef,$y) = add_more( data => $main, y => $y ); (undef,undef,$y) = add_more( data => $type, y => $y-10 ); (undef,undef,$y) = add_more( data => $princ, y => $y-10 ); #} } $pdf->save; sub add_more{ my (%args) = @_; my $data = $args{data}; my $y = $args{y}; $pdftable->table( $pdf, $page, $data, -x => 100, -start_y => $y, -next_y => 700, -start_h => 300, -next_h => 500, -w => 570, -padding => 5, -column_props=>[ map{ { justify => 'center' } }1..@{$data->[0]} ], ); }
      poj
        Right now I don't have access to the rest of the code, but the PDF I am making is kind of complex, I will need the code the way I has in my question, unless of course if its not possible to pass those values as references. Can I get back to you on that?
        Here is a more complete code I am using and it shows why I need the "for loop" to make tables for that block of data, I hope you can still read this:
        #!/usr/bin/perl use strict; use warnings; use PDF::API2; use PDF::Table; use Data::Dumper; # Landscape my $width = 785; my $height = 590; my $border_left = 50; my $border_right = 50; my $border_top = 100; my $border_bottom = 50; my $table_spacing = 50; my $target_page_no; my $page_no = 0; my $just_data = collect_data(); processing_data($just_data); exit; ### Collect data sub collect_data { my $multi = get_multi(); my $external = get_external(); my ($princ, $type, $person) = get_person(); my $just_data; foreach my $multi_row ( @{$multi} ) { my $member_number = shift @{$multi_row}; push ( @{$just_data->{$member_number}{multi}}, $multi_row); } foreach my $excluded_row ( @{$external} ) { my $member_number = shift @{$excluded_row}; push ( @{$just_data->{$member_number}{excluded}}, $excluded_row); } # The sub get_person returns 3 different sets of data foreach my $princ_row ( @{$princ} ) { my $member_number = shift @{ $princ_row }; push ( @{ $just_data->{$member_number}{princ} }, $princ_row); } foreach my $type_row ( @{$type} ) { my $member_number = shift @{ $type_row }; push ( @{ $just_data->{$member_number}{type} }, $type_row); } foreach my $person_row ( @{$person} ) { my $member_number = shift @{ $person_row }; push ( @{ $just_data->{$member_number}{person} }, $person_row); } return $just_data; } sub processing_data { my $just_data = shift; foreach my $member_number ( keys %{$just_data} ) { my $pdf = new PDF::API2(-file => "my_dir/".$member_number.".pdf"); $pdf->mediabox($width, $height); my $multi = $just_data->{$member_number}{multi}; unshift @$multi,["Header 1a", "Header 1b", "Header 1c", "Header 1d" +]; ### First Table my ($first_pdf, $first_page, undef, $first_y) = make_table( pdf => $pdf, #page => $page, data => $multi, title => "Sub Header for 1a", pol_y => "", doc_name => $member_number, ); table_space( pdf => $first_pdf, table_spacing => $table_spacing, page => $first_page, send_y => $first_y, ); ### End First Table my $excluded = $just_data->{$member_number}{excluded}; unshift @$excluded,["Header 2a", "Header 2b", "Header 2c", "Header +2d", "Header 2e", "Header 2f", "Header 2g", "Header 2h", "Header 2i" +, "Header 2j", "VHeader 2k"]; ### Second table my($sec_pdf, $sec_page, undef, $sec_y) = make_table( pdf => $first_pdf, #page => $first_page, data => $excluded, title => "Sub Header for Header 2", pol_y => "", doc_name => $member_number, ); table_space( pdf => $sec_pdf, table_spacing => $table_spacing, page => $sec_page, send_y => $sec_y, ); ### End Second Table my $princ = $just_data->{$member_number}{princ}; unshift @$princ,["Header 3a", "Header 3b", "Header 3c", "Header 3d" +]; my $type = $just_data->{$member_number}{type}; unshift @$type,["Header 4a", "Header 4b", "Header 4c",]; my $person = $just_data->{$member_number}{person}; unshift @$person,["Header 5a","Header 5b", "Header 5c", "Header 5d" +,"Header 5e","Header 5f", "Header 5g", "Header 5h",]; # print 3 tables for each block for my $i ( 0 .. $#{ $princ } ){ my $x = $border_left; my $w = 650; # table my ($third_pdf, $third_page,undef,$third_y) = make_table( pdf => $ +sec_pdf, #page => $page, data => $princ->[$i], title => "More Header 5" +, pol_y => "", doc_name + => $member_number, ); table_space( pdf => $third_pdf, table_spacing => $table_spacing/2, page => $third_page, send_y => $third_y, ); my $block_page_no = $pdf->pages; # table $w = 180; $target_page_no = $block_page_no; my ($fourth_pdf, $fourth_page,$fourth_span,$fourth_y) = make_tabl +e( + pdf => $third_pdf, #page => $page, data => $type-> +[$i], title => "More Header 6", pol_y => "", doc_name => $me +mber_number, ); # table $x = 260; $w = 440; $target_page_no = $block_page_no; my ($fifth_pdf, $fifth_page, $fifth_span, $fifth_y) = make_table( + pdf => $fourth_pdf, + #page => $page, data => $person-> +[$i], title => "More He +ader 7", pol_y => "", doc_name => $memb +er_number, ); # call start of next block if( $fourth_span > $fifth_span ) { $third_page = $fourth_page; $third_y = $fourth_y; }elsif($fifth_span > $fourth_span) { $third_page = $fifth_page; $third_y = $fifth_y; }else { $third_page = $fourth_page; $third_y = ($fourth_y < $fifth_y) ? $fourth_y : $fifth_y; } table_space( pdf => $third_pdf, table_spacing => $table_spacing, page => $third_page, send_y => $third_y, ); } $pdf->save; $pdf->end(); } } # End of sub # Make tables sub make_table{ my (%args) = @_; my $pdf = $args{pdf} || ''; my $data = $args{data} || ''; my $title = $args{title} || 'title'; my $princ_y = $args{pol_y} || ''; my $doc_name = $args{doc_name} || 'report name'; my $x = $border_left; my $y = $height-$border_top; my $w = $width-$border_left-$border_right; my %font = ( 'H' => $pdf->corefont("Helvetica", -encoding => "utf8"), 'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"), ); my $page = new_page( pdf => $pdf, # send_y => $y, # send_font => %font, ); # title my $caption = $page->text(); $caption->font($font{'HB'},10); $caption->translate($x,$y+1); $caption->text($title); my $pdftable = new PDF::Table; my ($next_page, $span, $new_y) = $pdftable->table( $pdf, $page, $data, x => $x, w => $w, start_y => $y - 5, next_y => $height-$border_top, start_h => $y - 5, next_h => $height-$border_top, new_page_func => \&new_page, padding => 2, padding_right => 10, border => 0, background_color_odd => "#FFFFFF", background_color_even => "#E0E0E0", header_props => { font => $font{'HB'}, font_size => 10, font_color => '#000000', bg_color => '#FFFFFF', repeat => 1, justify => 'center', }, column_props => [ map{ { justify => 'center', font => $font{'H'}, font_size => 10, } }1..@{$data->[0]}], ); return ($pdf, $next_page, $span, $new_y); }; # create new page sub new_page { my (%args) = @_; my $pdf = $args{ pdf } || ''; my %font = ( 'H' => $pdf->corefont("Helvetica", -encoding => "utf8"), 'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"), ); ++$target_page_no; if ($target_page_no <= $page_no){ return $pdf->openpage($target_page_no); } # new page my $page = $pdf->page; ++$page_no; # page logo my $logo = "images/logo.jpg"; my $image = $pdf->image_jpeg($logo, 122, 35); my $gfx = $page->gfx; $gfx->image($image, 5, 538, 230, 57); # logo position and size on pag +e # page numbers my $g = $page->gfx(); $g->textlabel($width - 30,15,$font{'H'},8, "Page $page_no", -color => '#808080', -align => 'right', ); doc_title( pdf=>$pdf, page=>$page); month_doc( pdf=>$pdf, page=>$page); ind_inform( pdf=>$pdf, page=>$page); # line $g->linewidth(1); my $x = $border_left; my $y = $height - $border_top + 15; $g->move($x,$y); $g->line($width - $x,$y); $g->stroke; return $page; } # create space between tables sub table_space{ my (%args) = @_; my $page = $args{ page }; my $pdf = $args{ pdf }; my $got_y = $args{ send_y }; $got_y -= $args{table_spacing}; if ($got_y < $border_bottom){ $got_y = $height-$border_top; $page = new_page( pdf => $pdf, ); } } sub doc_title { my (%args) = @_; my $pdf = $args{pdf}; my $page = $args{page}; my %font = ( 'H' => $pdf->corefont("Helvetica", -encoding => "utf8"), 'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"), ); $page->gfx->textlabel( # PDF::API2 method 416, 566, # x, y $font{'HB'}, 11, # font, size "My Documment Name Here", # text -color => '#000000', -align => 'center', ); $page->gfx->textlabel( # PDF::API2 method 416, 553, # x, y $font{'H'}, 10, # font, size "More Doc title Here", # text -color => '#000000', -align => 'center', ); $page->gfx->textlabel( # PDF::API2 method 416, 543, # x, y $font{'H'}, 9, # font, size "100 Main street", # text -color => '#000000', -align => 'center', ); } sub month_doc { my (%args) = @_; my $pdf = $args{pdf}; my $page = $args{page}; my $date = get_date(); my %font = ( 'H' => $pdf->corefont("Helvetica", -encoding => "utf8"), 'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"), ); $page->gfx->textlabel( # PDF::API2 method 740, 565, # x, y $font{'H'}, 8, # font, size "For the Month: ", # text -color => '#000000', -align => 'right', ); $page->gfx->textlabel( # PDF::API2 method 777, 565, # x, y $font{'HB'}, 8, # font, size "$date", # text -color => '#000000', -align => 'right', ); $page->gfx->textlabel( # PDF::API2 method 740, 555, # x, y $font{'H'}, 8, # font, size "Doc Number: ", # text -color => '#000000', -align => 'right', ); $page->gfx->textlabel( # PDF::API2 method 770, 555, # x, y $font{'HB'}, 8, # font, size "0000007", # text -color => '#000000', -align => 'right', ); } sub ind_inform { my (%args) = @_; my $pdf = $args{pdf}; my $page = $args{page}; my $date = get_date(); my %font = ( 'H' => $pdf->corefont("Helvetica", -encoding => "utf8"), 'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"), ); $page->gfx->textlabel( # PDF::API2 method 416, 520, # first less move to left - second less move d +own # x, y $font{'HB'}, 12, # font, size "More tile infor here", # text -color => '#000000', -align => 'center', ); $page->gfx->textlabel( # PDF::API2 method 116, 520, # first less move to left - second less move d +own # x, y $font{'HB'}, 12, # font, size "Member Number: xx000", # text -color => '#000000', -align => 'center', ); } sub get_date { my ($mon, $mday, $year) = (localtime)[4,3,5]; return sprintf '%02d-%02d-%04d', $mon+1, $mday, $year+1900; }

        Thanks for looking!