Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re^8: Getting for() to accept a tied array in one statement

by haukex (Archbishop)
on Apr 18, 2019 at 20:22 UTC ( [id://1232778] : note . print w/replies, xml ) Need Help??


in reply to Re^7: Getting for() to accept a tied array in one statement
in thread Getting for() to accept a tied array in one statement

My point is, I cannot know what $art is, so to me this is a big no no: my @ar-deref = @{$art};

Yes, I agree that is bad (unless $art overloads @{}), but in the code you showed here, for (tie @ary, "My::Class"), there is no such "bad" de-reference of the return value of tie happening, not even an implicit one. for (tie @ary, "My::Class") { print "$x\n" } will just print something like My::Class=HASH(0x...) - as perlancar said, it's just looping over a one-element list, the return value of tie, and not the elements of @{$art}, as you seemed to be worried about.

Replies are listed 'Best First'.
Re^9: Getting for() to accept a tied array in one statement
by Veltro (Hermit) on Apr 19, 2019 at 08:35 UTC

    I absolutely agree with that too. I just interpreted a different intent:

    for (tie @ary, "My::Class", "some", "el", "ems") { ... } # NOPE # This makes for() only loops over a single value, the tied object.

    If the intention was to iterate over the 'object' then a possible solution would be to use a de-reference. However I felt this would be a bad idea and decided to point this out.

    But it doesn't matter, everyone has proposed solutions that are much better. Esp. the solution hdb has found now using the lvalue sub is absolutely fantastic.