1

のコンテキスト (配列/リスト/スカラー) を理解しようとしていますPerl
私は次のことを試しました:

@array = qw (john bill george);  
print @array;  
print "\n";  
@sorted = sort (array);  
print @sorted;  
  1. print @array引用された単語を連結するのはなぜですか? print "@array"; リストを印刷する必要がありますか? @つまり、配列を意味しますよね?では、なぜ引用が印刷に必要なのでしょうか?
  2. なぜprint @sorted;印刷されarrayますか?スカラーとして扱われる場合3、配列のサイズを出力する必要はありませんか?
4

2 に答える 2

4

print @sorted@前の行で :Pを忘れたため、"array" を出力します。変更sort(array)するsort(@array)と、"bilgeorgejohn" が出力されます。

引用された単語を連結する理由についてはprint @array、まず、次の点について同じページにいることを確認しましょうqw

@array = qw(john bill george);

と同等です

@array = ("john", "bill", "george");

したがって、3 つの要素の配列を取得しています。次に、のドキュメントをprint参照してください。にもののリストを渡すと、その時点での値(出力フィールドセパレーター)printで区切られて、すべてが順番に出力されます。$,デフォルトは空の文字列です。

したがって、次のことができます。

$, = " ";
print @array;

「ジョン・ビル・ジョージ」を手に入れる。

于 2013-04-10T20:07:16.473 に答える
2

この関数printは引数のリストを取り、それらの引数を出力します。

リストを明示的に渡すと、printそのリストの要素がスペースなしで出力されても驚かないことを願っています。

print 'one', 'two', 'three'; # prints "onetwothree

に配列を渡すことprintはまったく同じです。配列の内容はリストに変換されてから に渡されprintます。

my @array = qw(one two three);
print @array; # prints "onetwothree"

どちらの場合も、printは 3 つの引数を受け取り、それらの引数を区切らずに出力します。

実際、Perl は特殊変数を使用して、引数間の出力$,を制御します。printデフォルトでは空の文字列ですが、変更できます。

次に、あなたの他のケースを考えてみましょう。

my @array = qw(one two three);
print "@array"; # prints "one two three"

この例ではいくつの引数がprint取得されますか? まあ、それはただ一つですよね?単一の二重引用符で囲まれた文字列です。Perl が二重引用符で囲まれた文字列を検出すると、文字列内のすべての変数を展開します。その展開の結果は に渡されprint、出力されます。したがって、Perl が二重引用符で囲まれた配列をどのように展開するかを調べる必要があります。これは、 perldataのマニュアル ページで定義されています。

配列補間

配列とスライスは、要素を $" 変数 ("use English;" が指定されている場合は $LIST_SEPARATOR) で指定された区切り文字 (デフォルトではスペース) で結合することにより、二重引用符で囲まれた文字列に補間されます。

そのため、デフォルトでは、Perl は要素間にスペースを挿入することにより、配列を二重引用符で囲まれた文字列に補間します。の値を変更することで、その動作を変更できます$"

これら 2 つの例は同じように見えるかもしれませんが、実際には大きく異なります。

于 2013-04-11T08:47:52.030 に答える