Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: "Nonliteral literal" is just an expression.

by choroba (Cardinal)
on Sep 24, 2019 at 10:04 UTC ( [id://11106635]=note: print w/replies, xml ) Need Help??


in reply to "Nonliteral literal" is just an expression.

This calls for recursion.
#!/usr/bin/perl use warnings; use strict; use List::Util qw{ any }; sub flatten { my ($struct) = @_; if (ref [] eq ref $struct) { return map flatten($_), @$struct } elsif (ref \\"" eq ref $struct) { return $$struct } else { return \$struct } } use Test::More tests => 2; my $ar = [ [ 'HEAD_goes_here', 'BODY_here' ], [ 'FOOT', 'FOOT', 'FOOT', 'FOOT' ] ]; my @flat = @$ar; while ( any { ref [] eq ref $_ } @flat ) { @flat = map { ref [] eq ref $_ ? \(@$_) : \$_ } @flat; @flat = map { ref \\"" eq ref $_ ? $$_ : $_ } @flat; } is_deeply \@flat, [map \$_, qw[ HEAD_goes_here BODY_here FOOT FOOT FOOT FOOT ] ]; is_deeply [flatten($ar)], \@flat;

What's wrong with the "less helpful" template? Both approaches return the same result.

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

Replies are listed 'Best First'.
Re^2: "Nonliteral literal" is just an expression.
by rir (Vicar) on Sep 24, 2019 at 21:30 UTC
    What's wrong with the "less helpful" template?

    That is the interesting part. And it surprises me that I have never been caught by this in my years of occasional programming. I am still chewing on that aspect.

    Both approaches return the same result.

    Not quite, your tests are flawed. I wanted references to the same memory objects ("thingie" is out of style?) so running @flat through both your and my code is suspect on its face. When I comment out the while loop I don't get a happy result.

    On a side note: In the "not-thinking" part I started on a recursive solution; when I hit some snags and applied some thought map seemed a clear win. I should study the methods to go from one to the other: iter. vs. recurs.

    Using a shorter array:

    my $ar = [ [ 'a', ], [ 'b, 'c', ], ]; my $flat = flat( $ar ); print Dumper $ar, $flat;
    should yield:
    $VAR1 = [ [ 'a' ], [ 'b', 'c' ] ]; $VAR2 = [ \$VAR1->[0][0], \$VAR1->[1][0], \$VAR1->[1][1] ];
      Ah, now I understand! A small change in the flatten subroutine should fix that.
      sub flatten { my ($struct) = @_; if (ref [] eq ref $struct) { return map flatten($_), @$struct } else { return \$_[0] # <- We need to use the alias, not a copy. } }
      map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11106635]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-24 20:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found