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 が彼の投稿で述べたことです。