プロが教える店舗&オフィスのセキュリティ対策術

perl で 文字列を split で処理する時に、" や ' で挟まれた領域を一つの文字列として処理するにはどうやったらよいのでしょうか?
たとえば
$aaa = "aaa bbb 'c d e' fff";
@aaa = split(/ /, $aaa);
だと、
aaa
bbb
'c
d
e'
fff

となってしまいますが、
aaa
bbb
'c d e'
fff
となるようにするにはどうするのでしょうか?

A 回答 (4件)

一発で分割する正規表現は思い浮かびませんでした。



(ダブル)クオテーションで囲まれた部分にあるスペースを一旦、\0に置き換えてから
splitし、その後また元のスペースに戻すという方法を思いつきました。

$aaa = "aaa bbb 'c d e' fff";

$aaa =~ s/(['"].*?['"])/(my $s = $1) =~ tr| |\0|; $s/eg;
@aaa = split / /, $aaa;
@aaa = map { s/(['"].*?['"])/(my $s = $1) =~ tr|\0| |; $s/eg; $_ } @aaa;
    • good
    • 3
この回答へのお礼

ご回答ありがとうございました。

ここでの皆さまのご回答を参考にしてできるようになりました。

お礼日時:2009/10/28 10:58

一応無理すれば


@aaa = grep { defined $_ } split(/('.*?'|".*?")|\s+/, $aaa);
とかできるけど...
split だけではダメだと思う.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

質問が変でした。
split だけでは無理なので、どうやればよいか、と書くべきでした。
ここでの皆さまのご回答を参考にしてできるようになりました。

お礼日時:2009/10/28 10:58

ダブルクォーテーションが抜けてた


my $str = q(aaa bbb 'c d e' fff '' a b c 'X' 'Y' "AAA BBB" aiueo);
print "$str\n";
my @items = ( $str =~ /(?:"[^"]*")|(?:'[^']*')|(?:[^ ]+)/g );
for my $item (@items) {
print "$item\n";
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

質問が変でした。
split だけでは無理なので、どうやればよいか、と書くべきでした。
ここでの皆さまのご回答を参考にしてできるようになりました。

お礼日時:2009/10/28 10:57

split じゃ、たぶん無理です


my $str = "aaa bbb 'c d e' fff '' a b c 'X' aiueo";
my @items = ( $str =~ /(?:'[^']*')|(?:[^ ]+)/g );
for my $item (@items) {
print "$item\n";
}

この回答への補足

質問が変でした。
split だけでは無理なので、どうやればよいか、と書くべきでした。
ここでの皆さまのご回答を参考にしてできるようになりました。

補足日時:2009/10/28 10:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています