2

私は行を持っています:

$myline = 'ca,cb,cc,cd,ce';

ca$1に、cb$2に、などと一致させる必要があります。

不運にも

$myline =~ /(?:(\w+),?)+/;

動作しません。pcretest では、'ce'を $1 にのみ一致させます。それを正しく行う方法は?
while ループに入れる必要がありますか?

4

5 に答える 5

10

split関数を使用してみませんか:

@parts = split(/,/,$myline);

split区切り文字として指定した正規表現を使用して、文字列を文字列のリストに分割します。

于 2009-12-08T09:28:13.703 に答える
9

使いやすいのではないmy @parts = split(/,/, $myline)ですか?

于 2009-12-08T09:27:36.873 に答える
3

問題を解決するための良い方法ですがsplit、リストコンテキストで正規表現をキャプチャすることもうまく機能します。両方のアプローチについて知っておくと便利です。

my $line = 'ca,cb,cc,cd,ce';
my @words = $line =~ /(\w+)/g;
于 2009-12-08T13:18:40.003 に答える
3

CPANからダウンロードできるCSVPM、つまりText::CSVまたはを調べますText::CSV_XS

これにより、必要なものが得られ、引用符で囲まれた値がコンマで区切られている場合も考慮されます。

これらのモジュールを使用すると、データを簡単に分割して解析できます...

例えば:

my @field = $csv->fields;
于 2009-12-08T14:05:15.343 に答える
1

要素の数が可変である場合、あなたはあなたが目指している方法でそれをするつもりはありません。グローバルフラグを使用して文字列をループします。

while($ myline =〜/(\ w +)\ b / g){
    #$1で何かをする
}

実際のデータは「ca、cb、cc、cd、ce」よりも複雑であると推測しますが、そうでない場合は、正規表現の使用はおそらく保証されません。区切り文字で文字列を分割する方がよいでしょう。

my @things = split'、'、$ myline;
于 2009-12-08T09:35:47.310 に答える