in reply to What should be returned in scalar context?

How about returning an iterator in scalar context? For example, XML::XPath (and a lot of the XML::* modules for that matter) has a method findnodes() that returns such:
if ($results->isa('XML::XPath::NodeSet')) { return wantarray ? $results->get_nodelist : $results; # return $results->get_nodelist; }
The docs for Tie::Array::Iterable need some corrections, and you don't actually do the tieing ... but here is an example with it:
#!/usr/bin/perl -l use strict; use warnings; use Tie::Array::Iterable; sub foo { my @list = 0..9; return wantarray ? @list : Tie::Array::Iterable->new(@list); } # access as a list print for foo(); # or an iterator my $iter = foo()->from_start(); print ($iter->value),$iter->next until $iter->at_end;

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)

Replies are listed 'Best First'.
Re: Re: What should be returned in scalar context?
by tilly (Archbishop) on Dec 02, 2003 at 15:57 UTC
    That isn't an option that I would have thought of. I'll need to think through how it fits in my general programming style.
Re: What should be returned in scalar context?
by Abigail-II (Bishop) on Dec 02, 2003 at 16:45 UTC
    But that make you do different things in scalar and list context from the callers point of view. Here are two examples where the caller does the same in scalar and list context. First one returns an iterator that is context aware, in the second example the function itself is a context aware iterator.
    #!/usr/bin/perl use strict; use warnings; sub make_list { my @list = @_; my $count = 0; sub {wantarray ? do {$count = 0; @list} : $list [$count ++]} } my $list = make_list qw /red green blue white brown purple/; print scalar $list -> (), "\n"; print scalar $list -> (), "\n"; print join " " => $list -> (), "\n"; my @list = qw /one two three four five six/; my $count = 0; sub foo { wantarray ? do {$count = 0; @list} : $list [$count ++] } print scalar foo, "\n"; print scalar foo, "\n"; print join " " => foo, "\n"; __END__ red green red green blue white brown purple one two one two three four five six

    Abigail