free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2008-10-06) 最新 次の日記(2008-10-08)» /編集

2008-10-07 [長年日記]

§ [perl] ハイフンだけの行で区切る件

 件って何だよ。

 ちょっと考えたけど、これだけか。@list = $str =~ m/(.*?)(?:\n-+\n)/gs;

 なんか、gnuwin32のcatでファイルをまとめてから受け取ったときと、perlの引数としてファイル名を指定したときの動作が違う。cat経由だとMalformed UTF-8 character (unexpected continuation byte 0xa2, with no preceding start byte) in pattern match (m//) at ..

\perl\splitfaqs.pl line 4, <> line 545.とか出る。

  1. catかgnuwin32が腐っている。
  2. Windowsのパイプが腐っている。
  3. PerlはSTDINとFile IOの動作が違う。

どれか。

 むしろ、文字コード周り=腐海なので、黙ってUTF-8で統一するのが大人のマナー。Shift_JIS、森へお帰り。

 追記:いや、片手落ち。テキストの末尾が取得できないな。後から$'で取るか、でなきゃ、@list = $str =~ m/(.*?)(?:\n-+\n|\z)/gs;、とか。

本日のツッコミ(全4件) [ツッコミを入れる]
<< きむら(K) (2008-10-07 23:45)

とりあえず3.は真です。<br>スクリプトを見ないと断言できない部分がありますが、<br>パイプ経由でデータを取ってきたときと@ARGV経由で読んだときでは<br>微妙に違う部分があります。<br>あと、splitの方ですが、ファイルの内容を丸呑みしたのなら<br>split /(?<=\n)-+(?=\n)/, $str;<br>ではいかんでしょうか?

<< kuwa1 (2008-10-08 09:35)

PerlはActivePerl 5.10.0 build 1003で、スクリプトはこんなです。<br><br>use encoding "cp932";<br><br>$str = join("\n", <>);<br>@list = $str =~ m/(.*?)(?:\n-+\n|\Z)/gs;<br>print scalar @list;<br><br>もしかしてこれが足りないのかな。<br>use open ":encoding(cp932)";<br>use open ":std";<br>STD(IN|OUT)に対するuse open ":std"とuse encodingの影響の違いがよくわかりませんが。<br><br>splitは、それでいけました。splitだと/s modifierが指定できないから複数行のテキストが分割できんなあとか勝手に思ってました。\nですね。

<< きむら(K) (2008-10-09 03:07)

はい。use encoding 'cp932' では、<>で読み込むストリームに対して影響を及ぼしません。<br>use open 〜 でOKなのは、<>のストリームが、その宣言(?)の後で<br>オープンされるものだからです。<br>ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html#translate

<< kuwa1 (2008-10-09 13:20)

ありがとうございます。<br>かなり理解が深まったと思います。