2011-06-28 23 views
2
$text =~ s/(cat|tomatoes)/ ${{ qw<tomatoes cat cat tomatoes> }}{$1} /ge; 

${{ qw<tomatoes cat cat tomatoes> }}{$1}{ qw<tomatoes cat cat tomatoes> }->{$1}に置き換えることはできません。なぜですか?なぜ2つの `{`がここに必要ですか?

5 @array = qw<a b c d>; 
    6 $ref = \@array; 
    7 @{$ref} = qw<1 2 3 4>; 
    8 #@$ref = qw<1 2 3 4>;//also works 
    9 print "@array"; 

UPDATEは、だから、あいまいさが生じたとき{}のみが必要とされ、{}${}どちらも参照解除に必要であることを示し、そして唯一のスカラーコンテキストで$

答えて

10
${{ qw<tomatoes cat cat tomatoes> }}{$1} 

my $ref = { qw<tomatoes cat cat tomatoes> }; 
${ $ref }{$key} 
です

内括弧は匿名ハッシュコンストラクタを形成します。ハッシュを作成し、角括弧の内容を代入してから、そのハッシュへの参照を返します。

外側の角かっこは、ハッシュの逆参照の一部です。曖昧でない場合(例えば、単純なスカラーを逆参照する場合など)、それらは省くことができる(例えば、${$ref}{$key}の代わりに$$ref{$key})が、これはそのような状況ではない。

1も

{ qw<tomatoes cat cat tomatoes> }->{$1} 

を使用することもできましたので、それは/ Eを必要としないので、一つでも矢印表記を使用して逆参照、差は、使用されているバージョンは、単に変数の参照であるということですが、しばらく後者はPerlコードなので、/ eが必要です。スカラコンテキストで


あなただけ

${ qw<tomatoes cat cat tomatoes> }{$1} 

QW以来

${ "tomatoes" }{$1} 

と同じになることを持っていた場合は、()最後の値を返します。これは、順番に、(use strict;はそれを許可しないことを除いて)

$tomatoes{$1} 

と同じであり、それはあなたが望む明らかではありません。

+0

@new_perl、私は私の答えに追加しました。 – ikegami

+0

私は上記について疑問に思っているものを更新しました。私は結論を最終的に確認する必要があります。 –

+1

@new_perl、 "$スカラーコンテキストのみ"は間違っています。 [Dereferencing Syntax](http://www.perlmonks.org/?node_id=383504#deref_syntax)を参照してください。 – ikegami

2

外側の括弧は、内側の括弧で作成された匿名ハッシュを参照します。明確化のため

更新:あなたはそれの前に+を置くことによって、コンパイラに手掛かりを与える場合に使用第二のフォーマットが働くだろう:

+{ qw<tomatoes cat cat tomatoes }->{$1}

+0

をダビド@を、私は '{}'前に間接参照のために使用されていることを聞いたことがないが。本当? –

+0

追加の '+'は何をしますか? –

+0

'$ {{qw ........} 'の場合、' $ {'は匿名ハッシュコンストラクタ' {} 'で作成された匿名ハッシュを逆参照します。 2番目のケースは、意図的に手がかりを与えない限り、コンパイラに対して構文的にあいまいです。 +はコンパイラに、コードブロックではなく、式(ハッシュコンストラクタ)として{}を参照させます。 – DavidO

1

qwの周囲の{}が意味することについてPerlパーサーが混乱しています。中括弧を使用してハッシュリファレンスを作成する代わりに、中括弧がコードブロックを作成すると見なします。{}は、ハッシュの前にプラス記号を付けることによって、ハッシュを作成することを意味することができます。

$ text = '猫はベーコンを食べました'; $ text =〜s /(cat | tomato)/ + {qw(トマト猫のトマト)} - > {$ 1}/ge; print "テキストは$ text \ n"となりました。

ここでハッシュリファレンスの作成に関するセクションを参照してください

を「テキストは今トマトはベーコンを食べている」この版画:http://perldoc.perl.org/perlref.html

関連する問題