-1

このコードが正確に何をしているのか、perl の s* の意味は何ですか、このコードを書く他の方法はありますか。

my $group = join('","', split(/,\s*/, $tmp[4]))
4

4 に答える 4

7

,\s*は、コンマ()で始まり、その後にゼロ個以上の()スペース文字( )が続く文字列に一致する正規表現パターンです。,*\s

splitこのパターンを使用して、分割するセパレーターを検討する対象を決定します。たとえば、そのパターンでは、文字列foo,bar, bazを3つの文字列fooとに分割barしますbaz

以下は、Perl5.14.2およびUnicode6.0.0がスペース文字と見なすものです。

  • U+00009文字表
  • U + 0000Aラインフィード(LF)
  • U + 0000Cフォームフィード(FF)
  • U + 0000Dキャリッジリターン(CR)
  • U+00020スペース
  • U + 00085ネクストライン(NEL)
  • U+000A0ノーブレークスペース
  • U +01680OGHAMスペースマーク
  • U+0180Eモンゴル母音セパレーター
  • U + 02000 EN QUAD
  • U + 02001 EM QUAD
  • U +02002ENスペース
  • U +02003EMスペース
  • U +02004THREE-PER-EMスペース
  • U +02005FOUR-PER-EMスペース
  • U +02006SIX-PER-EMスペース
  • U+02007図のスペース
  • U+02008句読点スペース
  • U+02009シンスペース
  • U+0200Aヘアスペース
  • U+02028ラインセパレーター
  • U+02029段落セパレータ
  • U+0202Fナローノーブレークスペース
  • U+0205F中数学スペース
  • U+03000表意文字スペース
于 2013-02-17T21:13:59.697 に答える
1

コンパイル可能なときのコードが次のようになっていると仮定します。

my $test = "abc, xyz, mno";
print join('","', split(/,\s*/, $test));

次のように書き直すことができます。

my $test = "abc, xyz, mno";  
my @tokens = split /,\s*/, $test;   # split $test on `,\s*`
print join '","', @tokens;          # Join the array back on `","`.

そして、それが何をregex意味するかは、@ikegami の回答ですでに説明されています。

omitPerl では意味を変えないところで括弧を使用できることを覚えておいてください。

于 2013-02-17T21:22:13.663 に答える
1

これは、前の質問に対する回答のこの行の一部です

my $group = join('","',split(/,\s*/,$tmp[4]))

のように書いた方が良いと思います。

my $group = join ', ', map qq{"$_"}, $tmp[4] =~ /[^\s,]/g;

正規表現は、空白またはコンマではないすべての文字グループを抽出するため、文字列に適用するとTTT, TTC、結果はTTTand になりTTCます。はmap、各項目を二重引用符で囲みます。そして、joinそれらすべてを で区切られた単一の文字列に結合します,。これは与える"TTT", "TTC"

前の 2 つの質問に対する私の回答を読みましたか? 唯一の問題は、モジュールをインストールしたくないということのようでした。その場合の代替案を書きました。

于 2013-02-17T21:37:13.223 に答える
0

Rohl Jainに同意します。それはコードの断片です。ケースを思いつきました。

my $line = 'a,b, c,  d,e';
my $newline = '"'.join('","',split(/,\s*/,$line)).'"';
print $newline;

これが出力です。"a"、"b"、"c"、"d"、"e"

カンマで区切られたデータ行を取得し、スペースの埋め込みを削除して、カンマで区切られ、二重引用符で囲まれた行を作成します。行の先頭と末尾に二重引用符を追加したことに注意してください。

于 2013-02-17T21:50:09.277 に答える