标量“..”运算符的典型用法是什么?它只是选择文本块吗?
我自己有趣的例子:
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
答案 0 :(得分: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
如果您有某种包围条件,请在子语言中进行测试:
for (...) {
do_foo($x,$y,$z) if begin($x) .. end($z);
}
答案 1 :(得分:2)
在perl -e
之外,你真的不应该这样做。它是深奥和时髦的。关于how it maintains state with calling context,请查看我的帖子,甚至不是24小时前。这让我陷入了真实的应用程序中,因为我试图变得聪明,并且发现我认为它是一个很好的用例。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
另一种用法是这样的简单计数器:
perl -e 'foreach ( 1 .. 100 ){print"$_\n"}'