「すぐわかるPerl」 7.9 splitとjoin
splitは文字を分割し、リストコンテキストでは全文分割結果を、スカラーコンテキストでは分割した個数を返す。
split(/区切り文字のパターン/,区切る対象,区切る上限個数)
split(/区切り文字のパターン/,区切る対象) # 区切れる限り区切ります
split(/区切り文字のパターン/) # 例のあれ $_ を区切ります
split # 空白文字で区切ります
joinは逆。
join(間にはさむ文字列,くっつける文字列のリスト)
例として、表計算ソフトのタブ区切りのデータをカンマ区切りに直す。
while(<STDIN>){
print join(",",split)."\n";
}
これは受け取った文字列を1行1行処理して
joinで , を間に挟み、くっつける文字列のリストがsplit、空白?ん??
あ、この場合のsplitは単に空白で区切るって意味か。
ん?でも、カンマで区切っているんだよなぁ。このsplitって何?
わからん・・・
空白をカンマに置換、ではないし・・・
あと、\nの前の「.」。これも何だ?
抜くとsyntaxエラーになるし・・・わからん。
正規表現?違うような。
わからないまま時間が過ぎるんで、先に進む。
そのうちわかる日が来るさ・・・たぶん。
でも、こういうところで疑問がわいたら、誰に聞けばいいんだろう・・・
さて。
CSVはデータが数字ではない場合に二重引用符で囲んでいる。
その場合も考えて、次のように変換
while(<STDIN>){ #一行ずつ受け取り
@elements = split; #@elementsを空白文字で分割する
foreach(@elements){ #@elementsがなくなるまで下のループ文を実行
if(/\D+/){ #ifによる条件分岐。\Dは数字以外[^0-9]。数字以外のものにマッチすれば真。
$_ = "\"$_\""; #if文が真の場合には$_の前後に"をつける。
}
}
print join(",",@elements)."\n"; #joinでリスト@elementsを,でくっつけてprint
}
| 固定リンク
「Perl」カテゴリの記事
- 「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その2)(2009.02.24)
- 「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その1)(2009.02.23)
- 「すぐわかるPerl」 7.6 マッチした文字列と、その前後の文字列を扱う変数(2008.06.17)
- 「すぐわかるPerl」 8.9 コマンドの入出力に入出力を切り替える(2008.11.12)
- 「すぐわかるPerl」 8.8 標準入出力以外のファイルの制御(2008.10.08)









コメント