8

私はスプリット機能を2つの方法で使用しています。最初の方法 ( s​​plit への文字列引数) :

my $string = "chr1.txt";
my @array1 = split(".", $string);
print $array1[0];

次のエラーが表示されます。

印刷での初期化されていない値の使用

2 番目の方法 ( s​​plit の正規表現引数) で分割すると、エラーは発生しません。

my @array1 = split(/\./, $string); print $array1[0];

私の最初の分割方法は、ドットだけでは機能しません。

この背後にある理由は何ですか?

4

3 に答える 3

11

"\."ただ.、エスケープシーケンスに注意してください。

二重引用符で囲まれた文字列にバックスラッシュとドットが必要な場合は、"\\.". または一重引用符を使用します。'\.'

于 2012-08-25T16:22:36.633 に答える
6

ファイルを解析してサフィックスを取得するだけの場合は、 のfileparse()メソッドを使用することをお勧めしますFile::Basename

于 2012-08-25T16:19:11.760 に答える
3

Mat によって提供された情報の追加の詳細:

split "\.", ...最初のパラメータでsplitは、正規表現エンジンに渡される前に、最初に二重引用符で囲まれた文字列として解釈されます。マットが言ったように、二重引用符で囲まれた文字列内では、 a\はエスケープ文字であり、「次の文字を文字通り取る」ことを意味します。たとえば、二重引用符で囲まれた文字列内に二重引用符を入れるなどです。"\""

したがって、パターンとしてsplit渡さ"."れます。単一のドットは、「任意の文字で分割」を意味します。ご存知のように、分割パターン自体は結果の一部ではありません。そのため、結果として空の文字列がいくつかあります。

しかし、なぜ最初の要素が空ではなく未定義なのですか? 答えは のドキュメントにあります: (その 3 番目の引数)splitによって返される要素の数に制限を課さない場合、リストの最後から空の結果が静かに削除されます。splitすべてのアイテムが空であるため、リストは空であるため、最初の要素は存在せず、未定義です。

この特定のスニペットとの違いを見ることができます:

 my @p1 = split "\.", "thing";
 my @p2 = split "\.", "thing", -1;
 print scalar(@p1), ' ', scalar(@p2), "\n";

を出力します0 6

ただし、これに対処する「適切な」方法は、@soulSurfer2010 が彼の投稿で述べたことです。

于 2012-08-25T17:31:48.973 に答える