Perl/CGIプログラムのファイルとフォルダの操作
今回は、Perl/CGIプログラムから外部ファイルやフォルダを操作する方法について学習します。
外部ファイルやフォルダといっても、同じサーバー内で操作が許可されているエリアに限られますが。
このあたりの感覚は前回と同じですね。
編集前記
今回の編集前記は、改行コードについてのお話です。
まず、「改行コード」という言葉についてはわかりますでしょうか?
パソコンで「改行」と言ったときには、その行の終了を表し、次の文字からは次の行の開始を意味しますよね。
漢字の意味そのままで、行を改めるわけです。
動作的には、何らかの文書作成中にEnterキーを押した状態ですよね。
Enterキーが押されると、パソコン側では改行コードを挿入するわけです。
そして次の文字からは次の行扱いとして処理します。
改行コードは直接モニタには表示されませんが、文字入力用のカーソルが次の行に移動するので、その存在がわかるわけですね。
マイクロソフト社のワードなどでは、改行すると矢印マークがつきます。
あれはおそらく改行コードをイメージ化したものでしょうが、ちょうどあんな感じですね。
で、その改行コードですが…。
実は大きく分けて3種類あるんですね。
ちょうど同じ文字であっても文字コードによって、パソコン内部のコードの並びが異なるように…。
その3種類の改行コードも、どれも改行を表しているには違いないのですが、パソコン内部で採用しているコードが違うわけです。
文字コードも、パソコン側で扱える文字コードセットに沿ったコードの並びでないと正しい文字だと認識されないように…。
改行コードも、パソコン側で定義されているものでないと改行コードだと認められないのです。
そのあたりのことを認識し、あなたの Perl/CGIプログラム作成 にどう生かしていったらよいのかという話が今回のテーマです。
それではいきましょう。
まず、3種類の開業コードですが、これは、3種類のオペレーティングシステムによって決められています。
その3種類のオペレーティングシステムというのは…。
UNIX系
Macintosh系
Windows系
ちなみに一昔前の「MS-DOS」というのは、Windows系に入ります。
大きく分けてこの3つですね。
この3種類のオペレーティングシステムは、それぞれ別の改行コードを採用しています。
そのため、シンプルなデータ構造をしているテキスト形式のファイルをやり取りするときには、適切な改行コードに変換してやる必要があるのです。
例えば、Windowsで作成したテキストファイルを、UNIXにそのまま転送して表示させたとします。
その場合、改行コードはWindowsのままですから、UNIXでは改行コードだと認められませんよね。
そのため、本来改行されるべきところでは改行されず、レイアウトの崩れたテキストファイルが表示されてしまいますよね。
これはちょうど、Windowsのパソコンで作成したテキスト形式のファイルを、UNIXサーバーにそのままアップロードし表示させたのと同じです。
テキスト形式のファイルですから、 HTMLファイル はもちろん、Perl/CGIファイルや、設定ファイル「.htaccess」などもこの現象が発生するので注意が必要です。
これに対して同じ文書ファイルでも、ワードや一太郎など、専用のワープロソフトで作成した文書ファイルについてはこのような心配はありません。
なぜかと言うと、確かに文章が書かれている部分というのはテキスト情報なのですが…。
これらのファイルにはそれ以外に、各ワープロソフトで定義されているレイアウト情報も一緒になっているからですね。
つまり、同じ文字情報が入ったファイルでも、そのフォーマットはまったくちがうわけです。
ですから、各ワープロソフト専用のファイルや、画像ファイル、音声ファイルなどは、改行コードを意識しなくてもいいわけです。
今度は少し突っ込んでFTP転送という視点から、改行コードの存在するファイルとそうでないファイルについて見ていきましょう。
Perl/CGIプログラムファイルをFTPでサーバーにアップロードするときは、バイナリモードではなく、ASCIIモード(テキストモード)でアップロードしましょうといわれていますよね。
この2つのモードの違いというのは、実は単純に改行コードを変換してくれるかどうかというだけの話です。
バイナリモードとは、ファイル内容を何も変更しないで転送する設定。
ASCIIモードとは、改行コードを適切なものに変更して転送する設定。
この2つのモードを、転送するファイルの性質に合わせて使い分けていきましょうということなのです。
例えば、Perl/CGIプログラムであればテキスト形式のファイルなので、ASCIIモードでアップロードしないと、プログラム中の改行コード認識がうまく行われず、誤動作の原因になるわけです。
逆に、画像ファイルをASCIIモードでアップロードしてしまうと…。
画像データ表現のために使われていたコードと、改行コードが同じだった場合、その部分が書き換えられてしまい、ファイルの内容が壊れてしまいます。
このように、バイナリモードとASCIIモードには、それぞれ意味があるわけですね。
このような意味を理解していれば、例えばWindowsで作成したテキストファイルを、あらかじめ転送予定のUNIX形式に変換しておけば…。
テキスト形式のファイルであっても、バイナリモードで転送可能だということです。
改行コードについてもう少し具体的にお話しますと…。
UNIX系OSは「LF」。
Macintosh系OSは「CR」。
Windows系OSは「CR+LF」。
このように改行コードは表現されています。
ですから先ほどの例「Windowsで作成したテキストファイルを、UNIXにそのまま転送したらどうなるか?」という話ですが…。
正確に言うと、Windowsの改行コードは「CR+LF」で、UNIXは「LF」ですから、まったく改行されないというわけではありません。
Windowsの改行コードの一部を自分の改行コードだと判断し、処理する場合もあります。
ただしその場合、残りの部分というのは文字として扱われることになりますから、どちらにしても誤動作の原因が生まれるわけです。
ちなみに…。
「LF」とは「Line Feed」。
「CR」とは「Carriage Return」。
それぞれこのような意味を持っているらしいですね。
まぁこの意味については忘れてもよいのですが、改行コードの扱い方についてはしっかり覚えておきましょう。
以上が改行コードに関する基礎知識です。
ここまでのことを踏まえたうえで、ここからはあなたのPerl/CGIプログラム作成にどう生かしていくかという話をします。
ようするに、ここまでは前ふりだということです(苦笑)。
前ふり、全然短くなりませんね。
まぁ、大切な部分なので仕方ないといえば仕方ないのですが…。
それでは行きますよ。
まず、あなたがPerl/CGIプログラム作成を行う上で問題となることは、あたりまえですが、上記3種類の改行コードを直接処理しなくてはいけないときですよね。
前回学習したような テキスト形式の記録ファイルを扱う 場合には、テキスト形式のファイルをASCIIモードでアップロードしているので、改行コードに関してはそんなに意識する必要ありません。
しかしそうではなく、テキストファイルをアップロードできるようなPerl/CGIプログラムを作成した場合は困りますよね。
なぜなら、CGIという性質上、どのオペレーティングシステムで扱われたファイルが来るかわかりませんからね。
それ以外でも、 複数行入力可能なテキスト 情報を取得したときなどは、普通に改行コードが入ってきますよね。
そんなときのために、各オペレーティングシステムで扱われている改行コードに関しての、Perl/CGIプログラミングの知識が必要なわけです。
プログラム例として、各オペレーティングシステム上でバラバラに定義されている改行コードを統一し、その後の処理で改行コードがだぶらないようにするといったことをします。
では具体的に、Perl/CGIプログラム上で各改行コードを、どのように扱っていったらよいかについてお話します。
今回の改行コードのようないまいち実体のつかみにくいものに関しては、 16進コード で直接指定してやるのが一番です。
各オペレーティングシステムで改行を表している16進コードは以下のようになっています。
UNIX系では「\x0A」。
Macintosh系では「\x0D」。
Windows系では「\x0D\x0A」。
この3種類の16進コードは、今後必要になってくるので必ず覚えておきましょう。
このことから、改行コードを統一するためには 置換演算子 を使って…
「s/\x0D\x0A|\x0D|\x0A/\n/g;」
とすればよいわけですね。
このとき順番は「\x0D\x0A」を必ず最初に持ってくる必要があるので注意です。
なぜだかわからない場合は復習しておいてください。
これで改行コードプログラミングについては以上だと言いたいところなのですが、世の中に出回っている少し間違った改行コードの伝説があるので、最後はそれについてお話しておきますね。
その伝説というのは以下のようなものです。
改行コードというのは…。
UNIXでは「\n」。
Macintoshでは「\r」。
Windowsでは「\r\n」。
であるというものです。
さらに、改行コードを統一するためには「s/\r\n|\r/\n/g;」と書かなくてはいけないというものです。
これはある意味正しいと言えるのですが、根本的には間違っています。
どの当たりがどう間違っているのかについて、詳しく説明しだすとこのページすべてを使い切ることになるのでそれはできないのですが。
実際このように書いて正常に動作するのはWindowsとUNIXのPerlパッケージのみで、MacintoshのPerlパッケージでは正常に動作しない場合があるのです。
なぜこのようなことが起こるのかというと、それは…。
「実際の値としての改行コード値と、論理的な改行文字が別物だから」
だと言えるからです。
実際の値としての改行コードつまり、改行コードの16進コードは前述しましたとおりです。
では「\r」や「\n」というのは何なのでしょうか?
答えは前にも少し書きましたが、Perlパッケージで論理的に定義された文字を表したものです。
このことから何が言えるのかというと…。
各動作環境によって実際の改行コード値は「\x0A」「\x0D」や「\x0D\x0A」だったりするわけなのですが…。
改行するためにはどの環境でもPerlという言語では論理的な改行文字である「\n」が使われるということなのです。
逆に言えば、Perlプログラミングにおける改行とは「\n」なのですが、Perlパッケージが動作している環境によっては「\x0A」だったり「\x0D」だったり「\x0D\x0A」だったりするというわけです 。
なので結論として、あなたが改行コードを直接処理するようなPerl/CGIプログラムを作成する場合には…。
各オペレーティングシステムごとに。
UNIX系OSであれば「\x0A」。
Macintosh系OSであれば「\x0D」。
Windows系OSであれば「\x0D\x0A」。
そして、Perlパッケージが定義する改行コードを使うときには「\n」を使いましょうということです。
今度こそ、改行コードにおけるPerl/CGIプログラミングについては以上です。
ものすごく簡潔にしつつ、できるだけわかりやすくお話したつもりなのですが、わかりにくかったでしょうか?
この Perl/CGI講座 はあなたをはじめ、たくさんの人に読んでいただいています。
いろんな人のレベルに合わせながら、それでもある程度のクオリティーを保ちつつお話しするのってやっぱり難しいですね。
ただの表現力不足という意見もあるかもしれませんが(苦笑)。
もやもやした気持ちになりながらも、今回の学習に移りましょう。
ファイル操作
まずは、 Perl/CGIプログラム から指定した場所にファイルを作成したり削除するといったことをしてみましょう。
ファイル作成
ファイルを作成する方法には大きく分けて2種類あります。
1つ目は、あなたがパソコンを使う上で普通に使っているようなデータを記録するためのファイルです。
何でもよいのですが、文章や画像、音声などを記録したファイルのことですね。
2つ目は、シンボリックリンクのようなファイルです。
シンボリックリンクとは、あるファイルやフォルダに別の名前を与え、ユーザやアプリケーションがその名前をファイルやフォルダ本体と同様に扱えるようにする仕組みのことです。
UNIX系OSで使用される言葉なので、あまりなじみはないかもしれませんね。
Windowsで言うところのショートカットファイルのことです。
すぐに開きたいファイルやフォルダに対してショートカットを作成し、デスクトップに並べておきますよね。
ちょうどあんな感じです。
1つ目の通常のファイル作成には open関数 を使います。
open関数の書式は改めて説明する必要ないですよね。
2つ目のシンボリックリンク作成には、symlink関数を使います。
しかし、symlink関数は動作環境によってエラーを引き起こす恐れがあるので、あまりおすすめできません。
「symlink ("OLDFILE", "NEWFILE")」
「OLDFILE」へのシンボリックリンク「NEWFILE」を作成します。
成功時には「1」を返し、失敗時には「0」を返します。
open関数でファイル作成
前回の記事にも書きましたが、open関数の、上書きモードや追加書き込みモードを使うと、指定したパス上にファイルを作成することができます。
#!/usr/bin/perl
use strict;
my $file = './log.txt';
open (OUT,">$file");
print OUT "OK";
close (OUT);
print "Content-type: text/html\n\n";
print "OK";
exit;
このPerl/CGIプログラムを実行すると、「OK」と表示されます。
まぁこの「OK」というのは何の意味もないのですが(苦笑)。
このPerl/CGIプログラムが実行されると、同じフォルダ内に「log.txt」ファイルを作成し、「OK」と書き込みます。
同じフォルダ内に作成されているので、Perl/CGIプログラムファイル名部分を、「log.txt」に変えてアクセスしてみてください。
同じように「OK」と表示されます。
これがopen関数を使ったファイル作成です。
open関数やclose関数など、ファイル処理の基本的な流れはいいですよね。
忘れてしまった場合は復習しておいてください。
前回も「log.txt」を使用したので、サーバーにそのままファイルが残っていたかもしれませんね。
その場合は、ファイルの中身が書き換えられただけになります。
ファイル削除
ファイル作成にはそのタイプによって2種類に分けられましたが、ファイルを削除する方は簡単です。
ファイル削除用のunlink関数があるので、それを利用します。
「unlink (LIST)」
「LIST」に含まれるファイルを削除します。
削除に成功したファイルの数を返します。
unlink関数でファイル削除
それでは先ほどopen関数で作成しました「log.txt」を削除してみましょう。
#!/usr/bin/perl
use strict;
my $file = './log.txt';
unlink $file;
print "Content-type: text/html\n\n";
print "OK";
exit;
このPerl/CGIプログラムを実行すると「OK」と表示されます。
unlink関数にファイルパスを指定し削除しました。
先ほどと同じように「log.txt」にアクセスしてみてください。
「404 Not Found」つまり、指定したファイルは存在しないというようなメッセージが表示されます。
シンボリックリンクの処理
次は、Perl/CGIプログラムでシンボリックリンクを操作してみます。
symlink関数でシンボリックリンクの作成
まずは、symlink関数でシンボリックリンクを作成してみます。
しかし、シンボリックリンクをサポートしていない環境の場合、結構重大なエラーになってしまうのでここは適当に読み流すだけでもかまいません。
#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n";
my $file = './link';
if (symlink(".", $file)) {
print "OK";
} else {
print "NO";
}
exit;
このPerl/CGIプログラムは、symlink関数を実行し、成功したら「OK」、失敗したら「NO」を表示します。
symlink関数では、このPerl/CGIプログラムのシンボリックリンクとして「link」を作成するように指示が出されています。
作成場所は同じフォルダの中です。
1回目にアクセス(プログラムを起動)したときには、まだ「link」ファイルは存在していないはずなので、「OK」と表示されます。
次に、今作成しましたシンボリックリンク「link」にアクセスしてみましょう。
「link」は、ここで紹介しているPerl/CGIプログラムのシンボリックリンクですから、もう一度、プログラムが実行されます。
2回目に起動した場合はどうなるのかと言いますと…。
すでに「link」ファイルは存在していますから、symlink関数の実行は失敗に終わり「0」が帰ってきます。
そして「0」が帰ってくると、 if文 は不成立となりelse以降つまり、「NO」が表示されるというわけです。
open関数もsymlink関数も、ファイルを作成する関数にはちがいないんですが、作成するはずのファイルがすでに存在していたときの動きは異なるので、そのあたりを覚えておきましょう。
unlink関数でシンボリックリンクの削除
シンボリックリンクを削除するには、前述しましたunlink関数を使います。
#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n";
my $file = './link';
if (unlink($file)) {
print "OK";
} else {
print "NO";
}
exit;
今度はsymlink関数のときと同様に、unlink関数もその動作結果を評価する形式にしてみました。
以上がファイル作成と削除の例です。
<戻る>
フォルダ操作
次は、Perl/CGIプログラムからフォルダを作成したり削除したりしてみましょう。
フォルダの作成
フォルダの作成にはmkdir関数を使います。
書式
「mkdir ("DIRECTORY", "PERMISSION")」
「DIRECTORY」で指定されたフォルダを、「PERMISSION」で指定されたモードで作成します。
「PERMISSION」は頭に「0」を付けた8進数で表記するのが決まりです。
数値表現ですから「'」や「"」では囲みません。
例えば…。
「755」なら「0755」。
「644」なら「0644」。
「PERMISSION」を省略すると、「0777」が割り当てられます。
成功時には「1」を返し、失敗時には「0」を返します。
なのでこれも、結果を評価するのは簡単ですね。
mkdir関数でフォルダの作成
では実際に、mkdir関数でフォルダを作成してみましょう。
#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n";
my $directory = './test';
if (mkdir($directory, 0755)) {
print "OK";
} else {
print "NO";
}
exit;
このPerl/CGIプログラムを実行すると、同じフォルダ内に「test」フォルダを作成します。
そしてパーミッションは「0755」つまり、「755」が設定されています。
フォルダ作成とパーミッション設定に成功したら「OK」が表示されます。
すでに同名のフォルダが存在するなどで、新たに作成できない場合は「NO」が表示されます。
ですから、1回目にこのPerl/CGIプログラムにアクセスしたら「OK」が、続いて再読み込みなどで2回目にアクセスした場合には「NO」が表示されます。
フォルダの削除
フォルダの削除にはrmdir関数を使います。
書式
「rmdir (DIRECTORY)」
「DIRECTORY」で指定したディレクトリが空であれば削除します。
「DIRECTORY」で指定したフォルダ内に、何らかのファイルやフォルダがある場合には削除しません。
成功時には「1」を返し、失敗時には「0」を返します。
なのでこれも、結果を評価するのは簡単ですね。
rmdir関数でフォルダの削除
では実際に、rmdir関数でフォルダを削除してみましょう。
#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n";
my $directory = './test';
if (rmdir($directory)) {
print "OK";
} else {
print "NO";
}
exit;
このPerl/CGIプログラムを実行すると、指定したフォルダが削除されます。
フォルダの削除に成功すると「OK」が、失敗すると「NO」が表示されます。
先ほどmkdir関数で空の「test」フォルダを作成しているので、そのまま放置していた場合は、1回目のアクセスでそのフォルダが削除されるので「OK」が表示されます。
そして再読み込みなどで2回目にアクセスした場合は、もう「test」は削除されているので「NO」が表示されるわけですね。
フォルダ内の読み取り
前回はファイルの読み書きを、そして今回は、ここまでファイルとフォルダの作成と削除を学習してきました。
ここではそれらの処理に関連して、Perl/CGIプログラムでフォルダ内を読み取るということをやっていきましょう。
書式
フォルダの中の読み取りには、前回学習しましたファイルの読み込みプロセスと似たステップを踏みます。
つまり、フォルダを開く関数、フォルダ内を読み取る関数とフォルダを閉じる関数があるわけですね。
さらに、目的フォルダまでのパスと任意のハンドル名を関連付けて処理させるところまで同じです。
opendir (HANDLE, DIRECTORY);
readdir (HANDLE);
closedir (HANDLE);
まずはopendir関数から…。
opendir関数で指定フォルダ「DIRECTORY」を開きます。
そのとき同時に、任意のハンドル名「HANDLE」と、指定フォルダまでのパス「DIRECTORY」を関連付けます。
成功すれば「真」を返します。
次はreaddir関数です。
readdir関数は、「HANDLE」に関連付けられたフォルダ内を読み取ります。
読み取った情報は 単純変数や配列変数 で受けたり、 ループ 条件にするなどいろいろできます。
最後はclosedir関数です。
closedir関数は、「HANDLE」に関連付けられたフォルダを閉じます。
フォルダ内の読み取り手順は以上です。
前回のファイル読み込みとかなり似ていますよね。
フォルダ読み取り
それでは実際に、フォルダの中身を読み取ってみましょう。
#!/usr/bin/perl
use strict;
my $directory = './';
opendir (DIRECTORY, $directory);
my @filelist = readdir (DIRECTORY);
closedir (DIRECTORY);
print "Content-type: text/html\n\n";
foreach my $file (@filelist) {
print $file, "<br>\n";
}
exit;
このPerl/CGIプログラムを実行すると、プログラムファイルが格納されているフォルダの中身がすべて表示されます。
もちろん、このPerl/CGIプログラムファイル名も表示されます。
ファイルとフォルダの共通操作
最後に、今まで学習してきたもの意外にファイルとフォルダの操作でよく使われる関数を紹介しておきます。
ここで紹介する関数は、ファイルでもフォルダでも同じように使えるので覚えておくと便利ですよ。
名前の変更
ファイル名やフォルダ名を変更するには、rename関数を使います。
主にファイル名変更で使用する関数ですが、環境によってはフォルダ名の変更もできます。
書式
rename関数の書式はこんな感じです。
「rename("OLDNAME", "NEWNAME")」
すでに存在するファイル名またはフォルダ名「OLDNAME」を、新しい名前「NEWNAME」に変更します。
すでに「NEWNAME」が存在していた場合は上書きします。
成功時には「1」を、失敗時には「0」を返します。
rename関数で名前の変更
それでは実際に、rename関数を使ってみましょう。
#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n";
my $old = './test1';
my $new = './test2';
if (rename($old, $new)) {
print "OK";
} else {
print "NO";
}
exit;
このPerl/CGIプログラムを実行すると、同じフォルダ内に格納されている「test1」を「test2」に変更します。
このまま実行すると、「test1」は存在していませんから、「NO」が表示されます。
ファイルでもフォルダでもよいので「test1」を作成し、同じフォルダ内に設置して再びアクセスすると、名前が「test2」に変更され「OK」が表示されます。
パーミッションの変更
パーミッションの変更にはchmod関数を使います。
書式
「chmod ("PERMISSION", "PATHLIST")」
「PATHLIST」で指定されたファイルやフォルダのパーミッションを、「PERMISSION」で指定された値に変更します。
「PATHLIST」には、主に単純変数や配列変数内にパスを格納して指定します。
「PERMISSION」は、mkdir関数のパーミッション指定方法と同じです。
戻り値は、最終的に指定されたパーミッションに設定された「PATHLIST」の数で決まります。
chmod関数でパーミッションの変更
では実際に、chmod関数でパーミッションを変更してみましょう。
#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n";
my $path = './test';
if (chmod(0644, $path)) {
print "OK";
} else {
print "NO";
}
exit;
このPerl/CGIプログラムを実行すると、同じフォルダ内にある「test」のパーミッションを「644」に変更します。
「test」はファイルでもフォルダでもよいのですが、実際に存在していて、最終的にパーミッションが「644」になっていれば「OK」が表示されます。
例えば、同じフォルダ内に「test」フォルダをパーミッション「755」で設置したとします。
そしてこのPerl/CGIプログラムを実行すると、パーミッションが変更され「644」になり「OK」が表示されます。
その後再読み込みしてもう一度Perl/CGIプログラムを動作させても、パーミッション変更処理は行われませんが、最終的に指定された「644」になっているので「OK」が表示されます。
このあたりは、symlink関数と違うところですから注意しましょう。
これで今回の学習テーマであるファイルとフォルダ操作については以上です。
編集後記
今回の編集後記は、冒頭で改行コードについてお話したので、その流れを引き継いでもう少し改行コードプログラミングについてお話していきますね。
編集前記では改行コードを「\n」に統一するといったことをしたので、ここでは、改行コードを削除するといった処理を考えていきましょう。
改行コードを統一するときに、置換演算子に16進コードで直接指定しましたよね。
なので、「s/\x0D\x0A|\x0D|\x0A//g;」とすれば、同じように改行コードを削除できます。
確かに、これでもいいんですが…。
ようするに「\x0D」と「\x0A」の2つを削除すればよいだけなので、「s/[\x0D\x0A]//g;」と書けばもう少しスマートに表現できるわけです。
どちらが正解というのではなく、どちらも正解なので好みで使い分けてください。
さらに、今回使用したような置換演算子が嫌なら、変換演算子「tr~」を使用することもできます。
あくまでも好みの問題なのでそのあたりは自由なんですが、ひとつ注意しておかなくてはいけないところがあるので、それだけお話しておきますね。
それは、この方法で改行コードを削除してしまうと、文字列の中に含まれるすべての改行コードが削除されてしまうということです。
それが目的ならいいですよ。
でも、そうでないときは少し困りますよね。
例えば、1行入力された場合のように、文字列の最後にだけ改行コードがあるとわかっていれば、chomp関数を使うのが一般的で簡単です。
ただし、chomp関数の基準はWindows、MacintoshやUNIXといった処理系に依存します。
どういうことかというと例えば…。
Windowsの改行コード「\x0D\x0A」を、UNIXのPerlパッケージでchompした場合は、「\x0D」が残ってしまいます。
もし、複数の改行コードを処理しなくてはいけない場合は困るわけですね。
そんなときは、常に行末を指定しつつ、改行を表した16進コードで直接削除していくしかありません。
例えば「s/\x0D?\x0A?$//;」といった感じです。
これならいけますね。
こんな感じで、プログラミングの知識がつけば、いろいろなパターンを考えられるようになります。
あなたも練習のつもりで、いろいろやってみることをおすすめします。
今回の学習は以上です。
ありがとうございました。
<戻る>