in reply to Perl treats '...' the same as '..'. Why?

In scalar context, perl treats the .. and ... operators as only slightly different from one another, just like the other repondants said. Thus:
if(a() ... b()) { # etc
and
if(a() .. b()) { # etc
are almost, but not exactly the same. That's the reason why both exist.

In list context, that is, the way you were using it, they appear to act exactly the same. I can't, in the same perspective, really imagine

print 3 .. 3;
to behave differently from
print 3 ... 3;
Can you?

Replies are listed 'Best First'.
Re: Re: Perl treats '...' the same as '..'. Why?
by sfink (Deacon) on Apr 19, 2004 at 17:03 UTC
    Well, it does seem a little odd to me to have
    echo -e "1\n2\n3\n4" | perl -lne 'print if 2..2'
    return the same as
    perl -le 'print 2..2'
    while
    echo -e "1\n2\n3\n4" | perl -lne 'print if 2...2'
    returns something very different from
    perl -le 'print 2...2'
    I understand why it does, but it would seem preferable to either disallow ... in list context, or make it behave "the same" in list and scalar contexts. (So the list 2...2 would be 2,3,...,INTMAX, and the list a()...b() would be the same as a()..b() unless a()==b(), in which case it would be a(),...,INTMAX.)

    Although, come to think of it, I think what would really make sense is if someone wrote a source filter than numbers all of the operators, with .. in slot 2 and ... in slot 3, so that you can use a sequence of periods of the appropriate length to choose any operator in Perl. Perl likes gathering up different programming paradigms, right? (Functional, OO, logical, ...) So this would make it easier to implement the genetic algorithm style, where you start off with something simple like

    $x = $x ....... $y ...... $z ...... $x; $y = $x ...... $y ........... $z; $z = $x .... $y ........ $z;
    and then you can easily mutate and interbreed code merely by changing the number of periods. Repeat until you get the answer desired. Some of my debugging sessions already closely resemble this.