blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

Perl 改行処理「 chomp 再び 」(0x2e)

Perl 改行処理「 chomp 再び 」(0x2e)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x2e 回。

Perl で、改行処理の有無について確認する。


改行の有無による表示 (出力) の違い



前回の「 Perl 配列の「 奇妙な空白 」 (0x2d) 」までで例として見てきた次のコードでは、たぶん 4 行目の print 文が少し不安です。

なぜといって、そこには改行文字が含まれるのか、含まれないのか、わからないからです。



print "Enter some lines, then press Ctrl + D:\n";
@line = ;

print "@line";


この場合、入力されるデータに改行が含まれるかどうかは、入力を行うユーザに委ねられています。

1 行目の print 文で「 Enter some lines (いくつかの行を入力します) 」と表示したところで、ユーザが複数行を入力するとは限りません。

例えば、1 行だけ入力して、改行することなく「 Ctrl + D 」がタイプされたとすると、配列に格納される要素には改行文字が含まれません。

しかし、同じ 1 行だけの入力でも、改行後に「 Ctrl + D 」がタイプされれば、配列の要素には改行文字がふくまれます。

改行文字が含まれるケースと、含まれないケースでは、例えば次の様に、print 文で表示する際のスタイルが異なります。

ここでは、ファイル名「 program.pl 」として保存した上記プログラムを perl コマンドで実行しています。「 $ 」は、コマンドラインのプロンプト (入力待ち受けの記号) です。

改行あり

$ perl program.pl # プログラムの実行
Hello, Perl. # 入力 改行
Hello, Perl. # Ctrl + D
$

改行なし

$ perl program.pl # プログラムの実行
Hello, Perl.Hello, Perl.$ # 改行なしで Ctrl + D


print 文の出力のみを取り出すと次の様になります。


改行あり

Hello, Perl.
$

改行なし

Hello, Perl.$


改行の有無でプロンプトの位置がずれていることがわかります。

プロンプトの位置がズレるくらいは問題じゃないと考えることも出来ますが、それは、これが単純なプログラムだからです。


例えば、外部のファイルに文字列を書き出す場合、該当する文字列に改行の有無が混在すると、データの並びに差異が生まれ、どこまでを 1 つのデータとして扱うべきか分からなくなります。

これはデータの加工処理を行う上で、望ましくない状態だと思われます。

改行をプログラム側でコントロールする



この様な状況で活躍するのが、「 chomp 演算子 」です。というよりも、chomp 演算子はここでしか活躍しません。

chomp 演算子補足 (0x17) - オペレーティングシステムをまたいだ改行処理 」で触れた様に、場合によっては完全に「 いらない子 」扱いされることもある chomp 演算子ですが、ここではあえて chomp 演算子を使います。

Perl STDIN でキーボードから入力を受け付ける それと chomp 演算子 (0x16) 」で確認した通り、chomp 演算子は改行文字を取り除きます。

ですから、次の様にすることで、改行の有無を憂慮する日々から解放されます。


print "Enter some lines, then press Ctrl + D:\n";
chomp (@line = ); # 改行を取り除く

print "@line\n";


2 行目で chomp をして改行を取り除き、4 行目の print 文に改行文字「 \n 」を含めています。

これで入力文字列の改行の有無に関わらず、出力時の改行は、1 行に 1 つと決められます。

改行あり

$ perl program.pl # プログラムの実行
Hello, Perl. # 改行
Hello, Perl. # Ctrl + D 改行は 1 つのみ
$

改行なし

$ perl program.pl # プログラムの実行
Hello, Perl.Hello, Perl. # 改行なしで Ctrl + D
$ # 改行される


print 文の出力のみを取り出すと次の様になります。

改行あり

Hello, Perl.
$

改行なし

Hello, Perl.
$


出力の内容が同じであることが確認出来ました。

0x2e -> 0x2f へ



実際のところ、ついこの間までは、元々改行文字を含んだデータに対して、改行文字を削除する処理を施す意味が分かりませんでした。

ところが、詳しく考えてみると "元々改行文字を含んだデータ" という前提が、思い込みだということがわかりました。

もちろん、内々で使う、単純で小さな (それでいて決まりきったデータのみを受け取る) プログラムであれば、問題はないでしょうが、実際のシステム運用やサービスではそういう訳には行きません。

また、「 chomp 演算子補足 (0x17) 」で説明した様に、改行コードはシステムによって異なります。

複数のシステム (例えば Unix 系と Windows) をまたいだデータの受け渡しがある様な場合は、chomp 演算子よりも正規表現を使った改行処理を行った方が良いかもしれません。

参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。

参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」

次回 (0x2f) へ続く。

過去記事 RSS










同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲