http://www.perlmonks.org?node_id=249015


in reply to Re: Re: Surpised by foreach iterator limitation
in thread Surpised by foreach iterator limitation

Explain to me why this wouldn't work:
sub exampl { my %p = @_; my @data = UNIVESAL::isa($p{data}, 'ARRAY') ? @{$p{data}} : ( $p{data} ); foreach my $datum (@data) { return if $p{required} && !$datum; # Do stuff that references $datum } return 1; # Everything is OK }
The point here is that you're stuck in the mode of "I have to reference things the same way". Much better is to say "I have an array of stuff. Let's work with that array."

Remember - You used to call it $p{data} because it was a member of that hash. Now, it's not. So, don't call it that. Embrace the refactoring goodness.

------
We are the carpenters and bricklayers of the Information Age.

Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.

Replies are listed 'Best First'.
Re: Re3: Surpised by foreach limitation
by shotgunefx (Parson) on Apr 08, 2003 at 18:03 UTC
    There is some misunderstanding here. Parts of the information regarding what I was trying to accomplish were spread out over subsequent posts but many are missing the one point since the first thread. I know why this doesn't work (once I tried it) and I know a million ways to fix it, yet I was suprised that Perl cannot use any lvalue in the iterator slot. Which I wish I named this thread :)

    The reason I tried it in the first place instead of just abondoning $p{data} was that the routine and some called by it expect to be able to reference _PARAMETER_ in the user defined error messages. The error messages replace _NAME_ with $p{NAME} using a regex which is why I did not want to refactor it. That means for the current parameter it must be set or everything retooled. I tried to fix it in the laziest and safest way which did not work which was fine because I went the second laziest way.
    for my $data (@data){ $p{data} = $data; ... }


    -Lee

    "To be civilized is to deny one's nature."