in reply to Re: What is Perl way to simultaneously assign to three separate arrays?
in thread What is Perl way to simultaneously assign to three separate arrays?

Thank you for your comments, esp. named captures and proper use of dump.

When I run the code, the array ends up having nine separate scalar elements instead of three references to anonymous arrays containing three scalar elements each

Here's what I'm currently getting:

[ "/projects/2138137193/iblab?ref=discovery", 2138137193, "iBlab", "/projects/2060538158/nz-hosting?ref=discovery", 2060538158, "NZ Hosting", "/projects/1956727289/how-to-build-a-spaceship?ref=discovery", 1956727289, "How To Build A Spaceship", ]

Here's what I want:

[ [ "/projects/2138137193/iblab?ref=discovery", 2138137193, "iBlab" ], [ "/projects/2060538158/nz-hosting?ref=discovery", 2060538158, "NZ Hosting" ], [ "/projects/1956727289/how-to-build-a-spaceship?ref=discovery", 1956727289, "How To Build A Spaceship" ] ]

How is this possible given the constraint that the entire HTML content is a scalar (obtained via LWP)?

(I realize I can "post-process" the @projects array but I'd like to know if everything can be done in a single assignment without any munging afterward.)

#! perl -w use strict; use Data::Dump qw(dump); my $html = '<h6 class="project-title"><a href="/projects +/2138137193/iblab?ref=discovery" target="">iBlab</a></h6><h6 class="p +roject-title"><a href="/projects/2060538158/nz-hosting?ref=discovery" + target="">NZ Hosting</a></h6><h6 class="project-title"><a href="/pro +jects/1956727289/how-to-build-a-spaceship?ref=discovery" target="">Ho +w To Build A Spaceship</a></h6>'; my @projects = $html =~ m|<h6 class="project-title"><a href="(/project +s/(\d+)/.+?\?ref=discovery)" target="">(.+?)</a></h6>|g; dump \@projects;
Searched for donut and crumpit. Found donate and stumbit instead.

Replies are listed 'Best First'.
Re^3: What is Perl way to simultaneously assign to three separate arrays?
by LanX (Saint) on Feb 15, 2015 at 10:42 UTC
    > I'd like to know if everything can be done in a single assignment without any munging afterward.)

    No, you are using /g in list context which swallows the whole file now and returns a flat list.

    You need an external loop to process the 3 groups

    update

    With a post while you can have the loop in the same line

     push @res, [ $1,$2,$3 ] while m/.../g

    In the OP you were originally looping with $_ , that's confusing.

    you should rather be concerned about maintainability than shortness.

    Cheers Rolf

    PS: Je suis Charlie!

      you should rather be concerned about maintainability than shortness.

      Agreed.

      Still, I am fascinated by idiomatic Perl and its myriad other ways of doing something (the Schwartzian Transform comes to mind).

      Searched for donut and crumpit. Found donate and stumbit instead.
Re^3: What is Perl way to simultaneously assign to three separate arrays?
by CoVAX (Beadle) on Feb 15, 2015 at 08:42 UTC

    Here's what I came up with to "post-process" the array to get what I wanted:

    #! /usr/bin/perl -w use strict; use Data::Dump qw(dump); my @src = ( "/projects/2138137193/iblab?ref=discovery", 2138137193, "iBlab", "/projects/2060538158/nz-hosting?ref=discovery", 2060538158, "NZ Hosting", "/projects/1956727289/how-to-build-a-spaceship?ref=discovery", 1956727289, "How To Build A Spaceship" ); my @dst = (); my $by = 3; my $len = @src / $by; die "Not an integral multiple\n" unless ( 0 == @src % $by ); for (my $i = 0; $i < $len; $i++) { push @dst, [ splice @src, 0, 3 ]; } dump \@dst;

    The output:

    [ [ "/projects/2138137193/iblab?ref=discovery", 2138137193, "iBlab", ], [ "/projects/2060538158/nz-hosting?ref=discovery", 2060538158, "NZ Hosting", ], [ "/projects/1956727289/how-to-build-a-spaceship?ref=discovery", 1956727289, "How To Build A Spaceship", ], ]

    I don't know why but lately I've been in a mood to "do it in one statement" or "do it in place". So I have to ask: "Can this be done in-place with just one array?"

    Searched for donut and crumpit. Found donate and stumbit instead.