8

标量“..”运算符的典型用法是什么?它只选择文本块吗?

我自己的一个有趣的例子:

sub get_next {
    print scalar($$..!$$), "\n";
}

get_next for 1 .. 5;  # prints numbers from 1 to 5
get_next for 1 .. 5;  # prints numbers from 6 to 10
4

4 回答 4

3

根据这里的问题,人们似乎几乎不知道它,但是,是的,我会说典型的用法是选择文本块,或者

while (<>) {
  print if /BEGIN/ .. /END/;
}

或者

while (<>) {
  print if 3 .. 5; # prints lines 3 through 5
}

后者是用于检查输入行号 ( $.)的语法糖

... if $. == 3 .. $. == 5;

这表明看起来很奇怪

#! /usr/bin/perl -l

for ($_ = 1; $_ <= 10; ++$_) {
  print if $_ == 4 .. $_ == 7;
}

上面程序的输出是

4
5
6
7

如果您有某种括号条件,请在 subs 中对其进行测试:

for (...) {
  do_foo($x,$y,$z) if begin($x) .. end($z);
}
于 2010-01-27T14:29:48.847 回答
2

在你之外perl -e真的不应该。它深奥而时髦。请参阅我在 24 小时前发布的关于它如何通过调用 context 保持状态的帖子。这在现实世界的应用程序中刺痛了我,因为我试图变得聪明,并找到了我认为是它的一个很好的用例。

于 2010-01-27T18:43:38.253 回答
2

这里有一个地方你需要非常小心无意使用标量范围运算符: 子例程返回

sub range {
     my $start = shift;
     my $end   = shift;

     return $start .. $end;
}

@foo = range( 1, 5 );  # ( 1, 2, 3, 4, 5 )
$foo = range( 1, 5 );  # False or maybe true.  Who knows.

如果你在标量上下文中调用这个子例程,你会大吃一惊。

在被这个问题的一些变体所困扰之后,我现在总是确保我将一个列表返回分配给一个数组,从而为我的 subs 获得类似数组的上下文行为。如果我需要其他特定于上下文的行为(很少),我会使用wantarray.

sub range {
     my $start = shift;
     my $end   = shift;

     my @result = $start .. $end;
     return @result;
}
于 2010-01-27T23:47:29.487 回答
0

另一种用途是像这样的简单计数器: perl -e 'foreach ( 1 .. 100 ){print"$_\n"}'

于 2010-01-27T13:23:52.310 回答