改行をCR(0x0d)で出力
投稿:2019-04-12、更新:2019-04-17
2019-04-17
出来合いの方法が見つかりました。
改行をCR(0x0d)で出力2 - Perl - ルモーリン
CRで出力する方法が上手いこと見つけられませんでした(泣)。
関連するページはこの辺り。
Perlの組み込み関数 open の翻訳 - perldoc.jp
open - 入出力のためのデフォルトの PerlIO 層をセットするための perl プラグマ - perldoc.jp
Perlの組み込み変数 $\ の翻訳 - perldoc.jp
どのご家庭でもよくやるopenの「:utf8」みたいなオプションを自分で作ることができる。
このオプションをなんて呼べば良いのだろう?
PerlIO::via - Helper class for PerlIO layers implemented in perl - metacpan.org
PerlIO::via - Helper class for PerlIO layers implemented in perl - metacpan.org
出力の際に「\n」を「\015(CR)」に置き換えるオプションを自作しました。
ファイル名はMyCR.pmです。
2019-04-17
全て小文字のパッケージ名は予約されているので大文字を入れました。
package MyCR; use utf8; use strict; use warnings; sub PUSHED { my ($class, $mode, $fh) = @_; my $dummy = ""; return bless \$dummy, $class; } sub WRITE { my ($obj, $buf, $fh) = @_; $buf =~ s/\n/\015/g; print $fh $buf; return length unpack "a*", $buf; } 1;
openのオプションに「:via(MyCR)」と指定すると上記で作ったMyCR.pmが使われます。
MyCR.pmをスクリプトと同じディレクトリからロードできるように$FindBin::Binを追加します。
#!/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 MyCR; use open IO => ":utf8"; binmode STDIN, ":encoding(console_in)"; binmode STDOUT, ":encoding(console_out)"; $| = 1; use constant BASENAME => "sample_89"; say "LFで改行"; if (open my $fh, "> :raw :utf8", BASENAME . "_lf.txt") { print $fh "たこルカは俺の嫁\n"; close $fh; } say "CRLFで改行"; if (open my $fh, "> :crlf :utf8", BASENAME . "_crlf.txt") { print $fh "たこルカは俺の嫁\n"; close $fh; } say "CRで改行"; if (open my $fh, "> :via(MyCR) :utf8", BASENAME . "_cr.txt") { print $fh "たこルカは俺の嫁\n"; close $fh; }
できたファイルをダンプしてみました。
使うツールは違いますがWindowsも同じ内容です。
hexdump -e '"%04_ax " 16/1 "%02x " "\n"' sample_89_crlf.txt 0000 e3 81 9f e3 81 93 e3 83 ab e3 82 ab e3 81 af e4 0010 bf ba e3 81 ae e5 ab 81 0d 0a hexdump -e '"%04_ax " 16/1 "%02x " "\n"' sample_89_lf.txt 0000 e3 81 9f e3 81 93 e3 83 ab e3 82 ab e3 81 af e4 0010 bf ba e3 81 ae e5 ab 81 0a hexdump -e '"%04_ax " 16/1 "%02x " "\n"' sample_89_cr.txt 0000 e3 81 9f e3 81 93 e3 83 ab e3 82 ab e3 81 af e4 0010 bf ba e3 81 ae e5 ab 81 0d