キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2012.02.01 00:28|カテゴリ:Perlコメント(0)

[Perl]小話:多くの人に誤解されている chomp 君の地位を向上させてみる


 よく Perl のコマンド紹介などで改行コードを削除する便利なコマンドとして紹介されるのが「chomp」というコマンドです。多くは、

「文字列の行末に改行がある場合はそれを削除し無い場合は何もしません」

 という紹介がなされます。こういう紹介をうけると、

「おぉ! こいつは便利だ改行コードを自動で削除してくれるんだ、きゃっほーっ!」

 ということになります。ところが試してみると 異なるOS間でやり取りしているデータに対して処理するとうまく動きません。なぜなら改行コードと呼ばれる文字には三種類のコードが存在し、chomp君が取ってくれるのは現在Perlが実行されている環境における改行コードだからです。その為ネット上では Perl 初学者の

「なんかchompがうまく動かないんですけど」

 という質問があり、回答として、

「改行コードはさっさと正規表現でとっちゃおうよ」

 という至極真っ当な意見とともに以下のようなコードが紹介されていたりします。

ex.
$line =~ s/\x{000d}\x{000a}$|\x{000d}$|\x{000a}$//g;
$line =~ s/[\r\n]+\z//;

 まあこれはこれでいいんですが大抵はもうここで、

「chomp君は駄目な子」

 ということで終了しています。きっと質問者やグーグル先生にお伺いを立てた人も、今後chomp君の存在さえ忘れてしまう事請け合いです。

「ただね、ちょっとまってください。chomp君にもいいところはあるんですよ」

 実はchomp君は改行コードを削除するコマンドではないんです。じゃあ何を削除しているかというと、

INPUT_RECORD_SEPARATOR

 という値を取り除いています。これはPerlの特殊変数「$/」に定義されている値です。この値の初期値が「\n」になっているためにchomp君は、

「行末の改行コードを取り除く」

 という扱いになっているのです。これ正確に言うと、

「chomp君は行末にある INPUT_RECORD_SEPARATOR を取り除く」

 コマンドなわけです。

 この特殊変数「$/」は自分で値を設定することができます。この値を区切りとしてテキストファイルの読み込み等も行うので OS X の Perl で Windows 改行のファイルを読み込む時

$/=\x{000d}\x{000a};

 なんて指定をしますよね。この指定をすればテキストファイルを Windows 改行を区切りにして読み込んでくれるのですっきり処理ができるわけです。で、セパレータを切り替えたのに、

「chomp君は駄目なやつだから」

 とか、

「そもそもみんな存在を忘れてる」

 なんて理由で改行コードを正規表現で削除したりしてますよね? 「$/」を切り替えたんなら、

「chomp君が取ってくれるんですよ」

 さらに INPUT_RECORD_SEPARATOR は自分で好きな値を指定することができます。別に改行コードでなくともいいわけです。特定の文字列を指定すればそれをセパレータとしてレコードの読み込みをしてくれます。どんな場合に使用するかと言えば、固定長のレコードが特殊な記号で連結されている場合などです。

 以下のサンプルコードは特定の文字列が変数の末尾にあった場合に該当文字列をchomp君に取ってもらう処理です。ご参考迄に。

#!/usr/bin/perl
use strict;
use utf8;  #-ソースがUTF8だという宣言

my $TEST = "TEST_AIUEO";
chomp($TEST);
print $TEST . "\n";
$TEST = "TEST_AIUEO";
$/ = "_AIUEO";
chomp($TEST);
print $TEST . "\n";
exit;
結果:
TEST_AIUEO
TEST

 と、ここまで書いておきながら自分もchomp君はあまり使ってないんですけどね。
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。