作者: Bruce.
日時: 2006/4/29(02:00)
Bruce.です。

藤岡和夫 さんは書きました (2006/04/28 22:53):

>> ところで、splitの引数なんですけど、\r\n|[\r\n] (順番が逆)にしないと
>> 誤動作するような気がするんですが気のせい?
> 
>  これは、よくわからないけど。僕が使っているのはもっとラフで


正規表現は最左最長マッチが原則ですから、[\r\n]が先にあると、

  hogehoge\r\n

という行があったときに、\r と \n の間に空のフィールドが
あると判断されます。まあ、空なんで処理に影響しないのかも
しれませんが。

use strict;
use warnings;
use File::Slurp;

my $contents = read_file('crlf.txt');
my @p1 = split /\r\n|[\r\n]/, $contents;
my @p2 = split /[\r\n]|\r\n/, $contents;

my $s1 = join "\x00", @p1;
my $s2 = join "\x00", @p2;

print unpack 'H*', $contents;
print "\n#####\n";
print unpack 'H*', $s1;
print "\n#####\n";
print unpack 'H*', $s2;

6162630d6465660d0a6768690a
#####
6162630064656600676869
#####
616263006465660000676869

ちょっとわかりにくいですが、三番目の例の出力では\r\nがひとつの
セパレータではなく、二つのセパレータが連続しているように
判定されています。

> [ \t]*[\r\n]+[ \t]*
> 
> で、改行とついでに前後の空白文字を削除しています。

このパターンでsplitしているということですか?
空行には意味がないのですね。

-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
  mail kbk@...
	web  www.kt.rim.or.jp/~kbk/index.html#zakkicho
	     homepage3.nifty.com/farstar/