in reply to Parsing bizarre non delimted data and hash slices

With regard to your first question, you've done it about as easily as it can be done; only other option I see is to change:
@new_hashes = map{ my $x = $_; +{ map { $_=>$x->{$_} } @wanted_keys } +} @old_hashes;
to
@new_hashes = map { my %x; @x{@wanted_keys}=@$_{@wanted_keys}; \%x } @ +old_hashes; # untested
Update: I see someone else already said that. To provide some new content, here's a different answer to the second question:
@cols = (split(' ', $data, 4), (map scalar reverse, reverse split(' ', reverse($data), 4))[1 +..3]);
Update: I actually "tested" that, and completely failed to notice that it did nothing like what I wanted. Try this instead:
@cols = split(' ', $data, 4); @cols[7,6,5,4,3] = map scalar reverse, split ' ', reverse($cols[3]), 5 +;
or the all in one version:
@cols = ((split(' ', $data, 4))[0..2], reverse map scalar reverse, spl +it ' ', reverse((split ' ', $data, 4)[-1]), 5);
Side note: ${\(expr)} does the same thing as (expr)[-1], and in fewer characters if you can omit the parentheses.

Replies are listed 'Best First'.
Re: Re: Parsing bizarre non delimted data and hash slices
by Not_a_Number (Prior) on Feb 01, 2004 at 15:39 UTC

    Doesn't work for me:

    while ( <DATA> ) { my $data = $_; my @cols = (split(' ', $data, 4), (map scalar reverse, reverse split(' ', reverse($data), 5)) +[1..3]); print "<$_>" for @cols; print "\n"; } __DATA__ 6 2 -78 testing stuff 0 69.68.119.54:28960 34756 250 +00 7 4 118 [:EsU:]|BLaZE| 0 24.86.4.164:28960 7248 500 +0 6 2 78 tesssssssting gg gggggggg REAAAAA 40 69.68.119.54: +28960 34756 25000

    Output:

    <6><2><-78><testing stuff 0 69.68.119.54:28960 34756 25000 ><0><69.68.119.54:28960><34756> <7><4><118><[:EsU:]|BLaZE| 0 24.86.4.164:28960 7248 5000 ><0><24.86.4.164:28960><7248> <6><2><78><tesssssssting gg gggggggg REAAAAA 40 69.68.119.54:28 +960 34756 25000 ><40><69.68.119.54:28960><34756>

    I had something similar, albeit so ridiculous that I didn't post it, but at least it seems to work :-)

    while ( <DATA> ) { my @tmp = split ' ', $_, 4; my @start = splice @tmp, 0, 3; @tmp = split ' ', (reverse $tmp[0]), 5; $_ = reverse for @tmp; my @parsed = ( @start, reverse @tmp ); print "<$_>" for @parsed; print "\n"; }

    Output (with the same DATA):

    <6><2><-78><testing stuff><0><69.68.119.54:28960><34756><25000> <7><4><118><[:EsU:]|BLaZE|><0><24.86.4.164:28960><7248><5000> <6><2><78><tesssssssting gg gggggggg REAAAAA><40><69.68.119.54:2896 +0><34756><25000>

    But as I'm still trying to understand your code, I can't see where the error is... ;-)

    dave

    Update: Eagle-eyed monks will already have noticed that my code is not quite the same as the original, namely here: reverse($data), 5, where ysth had: reverse($data), 4. This is (of course :) because I started playing with it before posting. However, the output in both cases appears to be the same...