ルモーリン
ホーム 更新 Perl Sample ランドナー サービス 雑談 コースガイド 鉄ゲタ 自転車 Linux リンク 連絡先

chomp内蔵に失敗

2019-04-17

:via(MyCR)ができるなら:via(MyChomp)も!?

この前、openに「改行をCRで出力」というオプションを追加できたので、味をしめて「入力で改行をchomp」というオプションを追加しようと思いました。 まあ、タイトル通りの結末なんですが(笑)。

モジュールMyChomp

ファイルMyChomp.pmです。
package MyChomp;

use utf8;
use strict;
use warnings;

use feature "say";

sub PUSHED {
	my ($class, $mode, $fh) = @_;
	my $dummy = "";

	return bless \$dummy, $class;
}

sub FILL {
	my ($obj, $fh) = @_;
	my $line = <$fh>;
	chomp $line if defined $line;
	return $line;
}

1;

サンプル

#!/usr/bin/env perl -w

use strict;
use warnings;
use utf8;

use feature "say";

use Encode::Argv;
use Encode::Locale;

use FindBin;
use lib $FindBin::Bin;

use MyChomp;

use open IO => ":utf8";

binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

use constant TEST_FILE => "sample_90.txt";

say "テストファイル生成";
if (open my $fh, ">", TEST_FILE) {
	print $fh "$_\n" for qw / 本日は晴天なり たこルカは俺の嫁 ルカ姐さんも俺の嫁 /;
	close $fh;
}

say "普通に読み込み";
if (open my $fh, "<", TEST_FILE) {
	say "'$_'" while <$fh>;
	close $fh;
}

say "MyChompで読み込み";
if (open my $fh, "< :via(MyChomp) :utf8", TEST_FILE) {
	say "'$_'" while <$fh>;
	close $fh;
}

実行結果

世の中厳しい、上手く行かないもんだ(泣)。 途中で改行コードを削除してしまうと、その後の入力処理で1行とみなすようですね。
テストファイル生成
普通に読み込み
'本日は晴天なり
'
'たこルカは俺の嫁
'
'ルカ姐さんも俺の嫁
'
MyChompで読み込み
'本日は晴天なりたこルカは俺の嫁ルカ姐さんも俺の嫁'