私は行を持っています:
$myline = 'ca,cb,cc,cd,ce';
caを$1に、cbを$2に、などと一致させる必要があります。
不運にも
$myline =~ /(?:(\w+),?)+/;
動作しません。pcretest では、'ce'を $1 にのみ一致させます。それを正しく行う方法は?
while ループに入れる必要がありますか?
使いやすいのではないmy @parts = split(/,/, $myline)
ですか?
問題を解決するための良い方法ですがsplit
、リストコンテキストで正規表現をキャプチャすることもうまく機能します。両方のアプローチについて知っておくと便利です。
my $line = 'ca,cb,cc,cd,ce';
my @words = $line =~ /(\w+)/g;
CPANからダウンロードできるCSVPM、つまりText::CSV
またはを調べますText::CSV_XS
。
これにより、必要なものが得られ、引用符で囲まれた値がコンマで区切られている場合も考慮されます。
これらのモジュールを使用すると、データを簡単に分割して解析できます...
例えば:
my @field = $csv->fields;
要素の数が可変である場合、あなたはあなたが目指している方法でそれをするつもりはありません。グローバルフラグを使用して文字列をループします。
while($ myline =〜/(\ w +)\ b / g){ #$1で何かをする }
実際のデータは「ca、cb、cc、cd、ce」よりも複雑であると推測しますが、そうでない場合は、正規表現の使用はおそらく保証されません。区切り文字で文字列を分割する方がよいでしょう。
my @things = split'、'、$ myline;