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

ある種のブラケット条件がある場合は、サブでテストします。

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

あなたの外でperl -eは本当にすべきではありません。それは秘教的でファンキーです。コンテキストを呼び出して状態を維持する方法については、24時間前でもない私の投稿を参照してください。これは、私が賢くなりたいと思っていて、それの良いユースケースであると思ったものを見つけたので、実際のアプリケーションに私を悩ませました。

于 2010-01-27T18:43:38.253 に答える
2

ここでは、スカラー範囲演算子の意図しない使用について非常に注意する必要がある場所があります: subroutine returns .

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.

このサブルーチンをスカラー コンテキストで呼び出すと、驚かれることでしょう。

この問題のいくつかの変種に悩まされた後、私は常にリストの戻り値を配列に割り当てるようにしています。他のコンテキスト固有の動作が必要な場合 (ごくまれに) を使用します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 に答える