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

> what is the "Perl way" to simultaneously push $1, $2, and $3 to the three arrays @ids, @urls, and @titles?

None, any golfing here would be awkward for just 3 arrays and too hard to maintain.

Truth is - like you already realized - that it doesn't make sense to have three different arrays.

This

my ($url, $id, $title) = ($_ =~ m|<h6 class="project-title"><a hre +f="(/proje +cts/(\d+)/.+?\?ref=discovery)" target="">(.+?)</a></h6>|o ); push @project, [$url, $id, $title];

already does the trick.

( IMHO even better $project{$id} = [$url,$title] )

Please note that I didn't try to replace ($url, $id, $title) with @matches cause you'd loose self-documenting names.

But if you really want to condense it further try

push @project, [ m|<h6 class="project-title"> ... yadda ... </h6>| +o ];

HTH!

Cheers Rolf

PS: Je suis Charlie!

PS: As a side note, better dump references

dump \@urls, \@ids, \@titles;

Replies are listed 'Best First'.
Re^2: What is Perl way to simultaneously assign to three separate arrays?
by CoVAX (Beadle) on Feb 15, 2015 at 04:41 UTC

    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.
      > 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.

      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.