perl the three dot operator

In my previous post, I discussed the range operator in the scalar context, here we are further to discuss on operator tha is quite unique in the Perl programming lanaugae, that is the three dot operator. 

 

... 

 

 

Some of the examples are referenced from the stackover post  http://stackoverflow.com/questions/11021512/perl-three-dot-operator-examples

 

 

Let's first see an example and then let 's delve into it.

 

 

use strict;


my @lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);

# the following command will print out Bar

foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}


# but the following comman will print out Baz and as well as Bar


print "=" x 10, "\n"; 

foreach (@lines) {
  if (/0/ ... /1/) { 
     print "$_\n";
   }
}

 

 

The output of the script will be like this: 

 

 写道
01 - Bar
==========
01 - Bar
1 - Baz
 

 

Let's first see the definition from one tutorial page: it has the following.

 

http://www.ooblick.com/text/perl/perl-talk1-text.html 写道
.. (dot dot)
The range operator is rather magical. It's one of my favorites.

In a list context, num1..num2 returns the list of numbers from num1 to num2. This is handy for taking array slices (@array[3..10]) or for repeating a loop a fixed number of times (for (1..50)...). Be aware, though, that this does generate a temporary array, so you can waste a lot of memory by using this with a large range.

In a scalar context, expr1 .. expr2 acts as a ``flip-flop.'' It starts out false. Then, once the left-hand expression becomes true, .. returns true and starts evaluating its right-hand expression, until that becomes true. After that, .. flip-flops back to being false.

This is useful for things like finding text between delimiters in a file:

perl -ne 'print if /BEGIN/../END/'
will read standard input and print all lines between lines delimited by BEGIN and END.

There is also a ... (dot dot dot) operator, related to .., but I won't cover it here.
 

The main reason is explained in the stackover flow post. Here is what it said.

 

 

http://stackoverflow.com/questions/11021512/perl-three-dot-operator-examples 写道
«...» doesn't do a flop check immediately after a true flip check.

With «..»,

" - Foo"
/0/ returns false.
.. returns false.
"01 - Bar"
/0/ returns true. Flip!
/1/ returns true. Flop! ⇐
.. returns true (since the first check was true).
"1 - Baz"
/0/ returns false.
.. returns false.
" - Quux"
/0/ returns false.
.. returns false.
With «...»,

" - Foo"
/0/ returns false.
... returns false.
"01 - Bar"
/0/ returns true. Flip!
... returns true.
"1 - Baz"
/1/ returns true. Flop!
... returns true.
" - Quux"
/0/ returns false.
... returns false.
 

你可能感兴趣的:(perl the three dot operator)