XP is just a number PerlMonks

### Re: Let's get lazy

by japhy (Canon)
 on Aug 28, 2001 at 20:47 UTC ( #108500=note: print w/replies, xml ) Need Help??

in reply to Let's get lazy

I'd suggest creating a function (or an object) that returns the next term in your requested series. The secret to laziness is an iterator.
```{
my \$init = 'aa';
my \$start = 'a';
my \$len = length \$init;

sub next_term {
my \$ret = \$init;
my \$p = \$len - 1;

while (1) {
substr(\$init, \$p, 1) =~ tr/acgnt/cgnta/;
last if substr(\$init, \$p--, 1) ne \$start;
\$init = "\$start\$init", \$len++, last if \$p < 0;
}

return \$ret;
}
}
You could also mimic this with a tied scalar, and have the FETCH function do what I have done above.
```package Tie::ScalarIter;

sub TIESCALAR {
my (\$class, \$init, \$start) = @_;
bless [ \$init, \$start, length(\$init) ], \$class;
}

sub FETCH {
my \$s = shift;

my \$ret = \$s->[0];
my \$p = \$s->[2] - 1;

while (1) {
substr(\$s->[0], \$p, 1) =~ tr/acgnt/cgnta/;
last if substr(\$s->[0], \$p--, 1) ne \$s->[1];
\$s->[0] = "\$s->[1]\$s->[0]", \$s->[2]++, last if \$p < 0;
}

return \$ret;
}

sub STORE {
my \$s = shift;
my \$rep = shift;

if (ref \$rep) { @\$s = (@\$rep, length \$rep->[0]) }
else { (@\$s[0,2] = (\$rep, length \$rep) }
}

1;
Both interfaces are simple to use:
```# functional

my @strings;
while (defined (my \$next = next_term())) {
last if length(\$next) > 4;
push @strings, \$next;
}

# tied scalar
use Tie::ScalarIter;

tie my(\$iter), 'Tie::ScalarIter', 'aa', 'a';
my @strings;

while (defined (my \$next = \$iter)) {
last if length(\$next) > 4;
push @strings, \$next;
}

_____________________________________________________
Jeff[japhy]Pinyan: Perl, regex, and perl hacker.
s++=END;++y(;-P)}y js++=;shajsj<++y(p-q)}?print:??;

Create A New User
Node Status?
node history
Node Type: note [id://108500]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (6)
As of 2017-08-17 08:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Who is your favorite scientist and why?

Results (285 votes). Check out past polls.

Notices?