1

私はPerlが初めてです。

この Perl ステートメントをどのように解釈すればよいですか?:

my( $foo, $bar ) = split /\s+/, $foobar, 2;

ローカル変数が分割関数によって同時に割り当てられていることは知っていますが、整数 2 が何のためにあるのかわかりません - func は 2 つの要素を持つ配列を返すと思いますか?.

Perl モンガーは上記のステートメントを私に説明できますか (ELI5)

また、場合によっては、分割される文字列に予期されるトークンが含まれていないため、foo または bar のいずれかが初期化されず、コード内でさらにそれらを使用しようとすると警告が発生します。

分割が「失敗」して 2 つの文字列が返された場合に備えて、$foo と $bar を適切な値 (null 文字列) に初期化するにはどうすればよいですか?

4

3 に答える 3

4

このsplit関数は次の 3 つの引数を取ります。

  1. " "区切り記号、または特殊な値(単一のスペースで構成される文字列) に一致する正規表現。文字列をトリミングし、空白のように分割します/\s+/

  2. 分割する文字列。

  3. 結果のフラグメントの最大数。これは、すべてのフィールドに関心がない場合の最適化である場合もあれば、ここにあるように各区切り記号で分割したくない場合もあります。

したがって、split式は最大で 2 つのフィールドを返しますが、必ずしも正確に 2 つとは限りません。変数に既定値を与えるには、 の前に既定値を割り当てるか、 の後にあるsplitかどうかを確認して、既定値を与えます。undefsplit

my ($foo, $bar) = ('', '');
($foo, $bar) = split ...;

または組み合わせる

(my ($foo, $bar) = ('', '')) = split ...

また

my ($foo, $bar) = split ...;
$_ //= '' for $foo, $bar;

LHS がの//=場合、演算子は RHS に値を割り当てますundef。ループは、コードを短縮するためのfor単なる方法です。

正確に 2 つのフィールドが生成された場合にのみ、コードを続行することもできます。

if ( 2 == (my ($foo, $bar) = split ...) ) {
  say "foo = $foo";
  say "bar = $bar";
} else {
  warn "could not split!";
}

スカラー コンテキストでのリスト割り当ては、割り当てられた要素の数に評価されます。

于 2013-08-29T08:59:30.447 に答える