これはかわいい、巧妙な例ですが、それについてはあまりにも難しいと思って、その目的から気をそらす。この本のこのセクションでは、リストスライスを見せています。リストにあるものに関係なく、リストをスライスする以外のものは、サンプルの目的と密接に関連していません。
あなたは(私たちは結合法の限界であったため、我々は文字通りのいずれかのより多くのページに合うことができませんでした)非常に大きな本の82ページだけですので、我々はで投げる可能性があまりありません君は。他のリストスライスの例の中に、私が実際のコードで使っていないこの巧妙なものがあります。それは、しかし、人為的な例の呪いです。
しかし、逆コンマ演算子があったとします。カンマの両側を評価する必要があります。多くの答えは「最初のものを返す」のために正しく機能します。しかし、それは機能ではありません。あなたがそれらの1つを持っていても、すべての式を訪問する必要があります。
私はすぐに間接参照、そのそれぞれが、その後何かを出力無名サブルーチンのシリーズで、このはるかに高度なバージョンが結果を返す考えてみましょう:
use v5.10;
my $scalar = (
sub { say "First"; 35 } ->(),
sub { say "wantarray is ", 0+wantarray } ->(),
sub { say "Second"; 27 } ->(),
sub { say "Third"; 137 } ->()
);
括弧が代入演算子の結合するので唯一の優先順位のためにそこにありますコンマ演算子よりも緊密に。そこにはリストはありませんが、1つのように見えます。
出力は、Perlはそれが最後の1に保たれていても、それぞれの評価を行っていることを示しています
First
wantarray is 0
Second
Third
Scalar is [137]
乏しいという名前wantarray内蔵のリターンを偽、サブルーチンはそれがスカラーコンテキストであると考えていることを指摘しました。
ここでは、すべての式を評価しながら最初のものを保持するように、それを反転させたいとします。あなたはリテラルリストへのアクセスに使用することができます:サブスクリプションの追加により
my $scalar = (
sub { say "First"; 35 } ->(),
sub { say "wantarray is ", 0+wantarray } ->(),
sub { say "Second"; 27 } ->(),
sub { say "Third"; 137 } ->()
)[0];
を、右側は現在のリストであり、私は最初の項目を引き出します。 2番目のサブルーチンはそれがリストコンテキストにあると考えていることに注目してください。
First
wantarray is 1
Second
Third
Scalar is [35]
しかし、これをサブルーチンに入れてみましょう。
my $scalar = reverse_comma(
sub { say "First"; 35 },
sub { say "wantarray is ", 0+wantarray },
sub { say "Second"; 27 },
sub { say "Third"; 137 }
);
say "Scalar is [$scalar]";
sub reverse_comma { (map { $_->() } @_)[0] }
それとも、私は他のものの結果を使用します。私はまだ、私は他のものの結果を使用することはありませんにもかかわらず、各サブルーチンを呼び出す必要がありますか?私が少し違ったことをしたならどうしますか?
use v5.10;
my $last;
my $scalar = reverse_comma(
sub { say "First"; 35 },
sub { say "wantarray is ", 0+wantarray },
sub { say "Second"; 27 },
sub { say "Third"; 137 }
);
say "Scalar is [$scalar]";
say "Last is [$last]";
sub reverse_comma { (map { $last = $_->() } @_)[0] }
今私はスカラーカンマを面白くする機能を参照してください。私が評価された式に$last
設定の副作用を追加します。これは、すべての式を評価し、そのうちのいくつかは、副作用があるかもしれません:
First
wantarray is 0
Second
Third
Scalar is [35]
Last is [137]
それはtchristは、シェルスクリプトと便利であること巨大な秘密ではありません。 Perlからcshへのコンバータは、基本的に彼の受信箱(またはcomp.lang.perl)でした。彼の例ではイディオムのようないくつかのシェルが現れます。 1つのステートメントで2つの数値を入れ替えるというトリックのようなもの:
use v5.10;
my $x = 17;
my $y = 137;
say "x => $x, y => $y";
$x = (
$x = $x + $y,
$y = $x - $y,
$x - $y,
);
say "x => $x, y => $y";
ここで副作用が重要です。
だから、戻ってラクダに、私たちは、副作用を持っている事がpop配列演算子であるところの例があります。
use v5.10;
my @foo = qw(g h j k);
say "list: @foo";
my $scalar = sub { return (pop(@foo), pop(@foo))[0] }->();
say "list: @foo";
これは、すべてのカンマのいずれかの側に、各表現を披露します評価される。私たちは完全な例を示さなかったので、サブルーチンラッパーで投げた:
list: g h j k
list: g h
しかし、これのどれもが、リテラルリストにインデックスを付けるたそのセクションのポイントはなかったです。この例のポイントは、他の例やPerlの機能とは異なる結果を返さないことでした。カンマ演算子の動作が異なると仮定して同じことを返すことでした。セクションはリストスライスに関するものであり、リストスライスを表示しているので、リスト内のものは重要ではありませんでした。
を役に立てば幸い
を何ができるかの一例である[ - 1] 'などのようなものです。 [あなたはこれで最初に混乱しているわけではありません。](http://computer-programming-forum.com/53-perl/0aa44266bcb822b5.htm) – ThisSuitIsBlackNot
ここでの議論はスライスに関するものなので、 '(foo、bar)[0]'を「逆カンマ演算子」として返します。リストをアセンブルする際の 'pop()'の選択は、せいぜい不幸です。 – tjd
@ThisSuitIsBlackNot:添え字が-1の場合、右手側を保持する非リバースカンマ演算子と同じ結果になります。下付き文字0では、左辺を保持します。 –