Perl Language
ファイルの内容を変数に読み込む
サーチ…
手作業による方法
open my $fh, '<', $filename
or die "Could not open $filename for reading: $!";
my $contents = do { local $/; <$fh> };
ファイルを開いた後(rawバイトの代わりに特定のファイルエンコーディングを読みたい場合はman perlio
を読んでください)、このトリックはdo
ブロックにdo
ます: <$fh>
、ダイアモンド演算子のファイルハンドルはファイルから単一のレコードを返します。 "入力レコードセパレータ"変数$/
は、 "レコード"が何であるかを指定します。デフォルトでは改行文字に設定されているので、 "レコード"は "1行"を意味します。 $/
はグローバル変数であるため、 local
は2つのことを行います: $/
一時的なローカルコピーを作成し、ブロックの終わりに消滅させ、(非)値undef
を与えます。初期化されていない変数へ)。入力レコードセパレータに(非)値がある場合、ダイヤモンド演算子はファイル全体を返します。 (ファイル全体が1行であるとみなします)。
do
を使うdo
、手動でファイルを開くこともできます。ファイルの繰り返し読み込みの場合、
sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }
my $content = readfile($filename);
に使える。ここで、別のグローバル変数( @ARGV
)は、パラメータ付きのperlスクリプトを開始するときと同じプロセスをシミュレートするためにローカライズされています。 $/
はundef
。なぜなら、その前の配列はすべての入力引数を "食べる"からです。次に、ダイヤモンド演算子<>
は、 $/
(ファイル全体)で定義された1つのレコードを再度配信し、 do
ブロックから戻り、次にdo
ブロックから戻ります。
サブに明示的なエラー処理はありませんが、これは悪い習慣です!ファイルの読み込み中にエラーが発生すると、空のファイルからの空の文字列ではなく、戻り値としてundef
が返されます。
最後のコードのもう一つの欠点は、異なるファイルエンコードにPerlIOを使用できないことです。常にrawバイトを取得します。
パス:: Tiny
マニュアルウェイのイディオムをスクリプトで数回使用するとすぐに面倒になり、モジュールを試してみることもできます。
use Path::Tiny;
my $contents = path($filename)->slurp;
ファイルエンコードや行末などを制御する必要がある場合は、 binmode
オプションを渡すことができます。 - man perlio
:
my $contents = path($filename)->slurp( {binmode => ":encoding(UTF-8)"} );
Path::Tiny
には、ファイルを扱うための他の多くの機能もありますので、良い選択です。
File :: Slurper
これは最小限のモジュールで、ファイルを変数に分割するだけです。
use File::Slurper 'read_text';
my $contents = read_text($filename);
read_text()
は、ファイルエンコーディングを指定する2つのオプションのパラメータと、unixish LFまたはDOSish CRLF標準の間で行末を変換する必要があるかどうかを指定します。
my $contents = read_text($filename, 'UTF-8', 1);
File :: Slurp
それを使用しないでください。それは長い間存在してきましたが、ほとんどのプログラマーが示唆しているモジュールでもありますが、壊れており、修正される可能性は低いです。
ファイルを配列変数にスラップする
open(my $fh, '<', "/some/path") or die $!;
my @ary = <$fh>;
リストコンテキストで評価されると、ダイヤモンド演算子はファイル内のすべての行からなるリストを返します(この場合、結果は配列のリストコンテキストに代入します)。ラインターミネータは保持され、chompによって削除することができます:
chomp(@ary); #removes line terminators from all the array elements.
1つのライナーでファイルをスラップ
入力レコードセパレータは、 -0
スイッチ( 0 、 大文字のOではなく)で指定できます。値として8進数または16進数が使用されます。 0400
以上の値を指定すると、Perlはファイルをスラップさせますが、この目的に使用される値は慣例として0777
です。
perl -0777 -e 'my $file = <>; print length($file)' input.txt
最小限に抑えて、 -n
スイッチを指定するとPerlは自動的に各行(ここではファイル全体)を変数$_
読み込みます。
perl -0777 -ne 'print length($_)' input.txt