0

私は当初、これに戸惑いました: Perl で文字分割関数に取り組んでいたところ、次のことに気付きました:

  DB<56> map(print("-", $_, "\n"), split( //, "test")  );
-t
-e
-s
-t

  DB<57> map(print("-", $_, "\n"), split( /./, "test")  );

  DB<58> map(print("-", $_, "\n"), split( /(.)/, "test")  );
-
-t
-
-e
-
-s
-
-t

// 空の正規表現を使用すると、文字列が個々の文字に分割されることは既に知っていました。しかし、正規表現のこれらの空の文字列がどこから来たのかは明確ではありませんでした/(.)/-しかし、ほんの数文後、ページには「正規表現にグループ化がある場合、生成されたリストにはグループ化からの一致した部分文字列も含まれます.. . $x の最初の文字が正規表現に一致したため、 split は空の最初の要素をリストの先頭に追加しました。 " したがって、これは予期された動作です。(まあ、グループ化されていないドットが何もしない理由はまだわかり/./ません)

しかし、私もPythonで作業していて、同様の問題(分割の結果として空の文字列)が発生しました-そしてfilter(None, list)、この呼び出しでリストから空の文字列を単純に削除する関数を見つけました。Perlで同じことを達成するために何が使用されていますか?

4

1 に答える 1

5

の最初の引数はsplit、解析しているリストの用語を区切るものを定義します。最後の 2 つのスニペットでsplitは、任意の文字が有効な区切り文字であることを示しているためsplit、入力の文字の間にあるものを返します: 5 つの空の文字列。

>perl -E"say qq{<$_>} for split /./, 'test', -1;"
<>
<>
<>
<>
<>

(デフォルトでは、末尾の空の文字列は除外されます。)

解決策は、作成を依頼したものそのものを除外することではありませんsplit。セパレーターを修正するか

my @chars = split /(?<=.)|(?=.)/s;
my @chars = split //;

またはより良いツールを使用する

my @chars = /(.)/s;
my @chars = unpack '(a)*', $_;
于 2013-04-11T15:20:39.820 に答える