アプリ版:「スタンプのみでお礼する」機能のリリースについて

改行コードから改行コードまでをスプリットして配列に取り込む方法を教えてください。
ファイル「sample.txt」の中に

文字列A
文字列B
文字列C

文字列D
文字列E

文字列F
文字列G

と書かれていたとします。このファイルを開き、配列@listに
@list = 文字列A\r\n文字列B\r\n文字列C\r\n,文字列D\r\n文字列E\r\n,文字列F\r\n文字列G\r\n
となるようなコードを教えてください。
要は二重改行コード\r\n\r\nをスプリッタとして複数の行を配列に取り込む方法です。

よろしくお願いします。

A 回答 (5件)

$/ を適当に設定すればいいだけのような気がする.

    • good
    • 0
この回答へのお礼

お礼を失念しておりました。
ありがとうございます。

お礼日時:2012/03/16 00:07

use strict;


use warnings;
use Data::Dumper;

my $file = shift || 'data.txt';
open my $fh, '<', $file or die "$!:$file";
my @list = ();
{
local $/ = "\x0D\x0A\x0D\x0A";
@list = <$fh>
};
close $fh or die "$!:$file";
print Dumper(@list);
    • good
    • 0
この回答へのお礼

お礼を失念しておりました。
ありがとうございます。

お礼日時:2012/03/16 00:06

かぶった

    • good
    • 0
この回答へのお礼

そのようですねw

お礼日時:2012/03/16 00:07

まあ, カブっちゃうのはしょうがないですが>#3.


少なくとも Windows なら $/ = ''; で十分ですけどね.
    • good
    • 0
この回答へのお礼

お礼を失念しておりました。
ありがとうございます。

お礼日時:2012/03/16 00:06

Windowsの場合、テキストモードだと、\r\n ⇒ \nの自動変換がなされてしまうので、その場合はNo.2さんのコードでopen時に:rawを指定すればいいと思います。



open my $fh, '<:raw', $file or die "$!:$file";

No.2さんのコードでは最後の文字列に二重改行が付いてしまいますが、質問文のように改行を1つだけにしたいならば、

chomp @list;

とすればいいと思います。
splitにこだわるならば、

my @list = split /(?<=\r\n)\r\n/, do{ local $/; <$fh> };

でいけると思います。
    • good
    • 0
この回答へのお礼

なるべく簡単に1行で済ませたかったのでsplitしました。
ありがとうございます。

お礼日時:2010/05/19 22:43

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