Perl splitしてjoinしても元に戻らない?

| | Comments (0) | TrackBacks (0)
ご存じのとおり、Perlのsplit関数は、指定したセパレーターで文字列を分割してリストにします。
使い方とサンプルは下記の通り。

■使い方
split /PATTERN/, EXPR, LIMIT
split /PATTERN/, EXPR
split /PATTERN/
split
■サンプル
$var_before = "Sato:Suzuki:Kimura";
@list = split(/:/, $var_before);

@listの内容は、下のようになっています。※Data::Dumperを使用した出力。
$VAR1 = 'Sato';
$VAR2 = 'Suzuki';
$VAR3 = 'Kimura';

そして、この逆の処理をしてくれるのが、join関数です。
$var_before = "Sato:Suzuki:Kimura";
@list = split(/:/, $var_before);
$var_after = join(":", @list);

$var_afterの内容は、下のようになって$var_beforeと同じになりました。
$VAR1 = 'Sato:Suzuki:Kimura';


でも、splitしてjoinして元に戻すのは、はたしてこの方法で良いのでしょうか?


$var_beforeの値をちょっと変えてみると。
$var_before = "Sato:Suzuki:Kimura::";
@list = split(/:/, $var_before);
$var_after = join(":", @list);

$var_afterの内容は下のようになって$var_beforeと違う値になりました。末尾の":"が無くなっています。
$VAR1 = 'Sato:Suzuki:Kimura';

実はsplit関数は、この例のように使うと末尾の空フィールドは捨てられます。
$var_beforeには、セパレーターの":"(コロン)が末尾に連続しているので、splitの際、空フィールドとして捨てられてしまったわけです。ちなみに先頭や中間の空フィールドは保持されます。

splitの際、末尾の空フィールドを保持するためには、『■使い方』で示した"LIMIT"に負の値を入れます。
$var_before = "Sato:Suzuki:Kimura::";
@list = split(/:/, $var_before, -1);
$var_after = join(":", @list);
■@list
$VAR1 = 'Sato';
$VAR2 = 'Suzuki';
$VAR3 = 'Kimura';
$VAR4 = '';
$VAR5 = '';
■$vat_after
$VAR1 = 'Sato:Suzuki:Kimura::';

これにて$var_beforeと$var_afterは同じ値になります。


0 TrackBacks

Listed below are links to blogs that reference this entry: Perl splitしてjoinしても元に戻らない?.

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/142

Leave a comment

About this Entry

This page contains a single entry by Takehiko Kodama published on July 29, 2009 11:28 AM.

日経225のSPF対応状況(2009年7月) was the previous entry in this blog.

blinkタグとmarqueeタグはどうなったのだ is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.