Perlでファイルからノンリニアにデータを取得する [Perl]
ファイルからノンリニアにデータを取得するには、C言語ではseek()関数を使用してファイルの読み出し位置を変更しますが、Perlでも同様にseek()関数が用意されています。
例えば、ファイルの先頭から128バイト目の10バイトを読み込みたい場合は、
という感じに書きます。
seek ファイルハンドル, 位置, 起点
例えば、ファイルの先頭から128バイト目の10バイトを読み込みたい場合は、
my $file_name = "./data.txt"; open my $fh, "<", $file_name or die "Can't open the file $file_name\n"; seek $fh, 128, 0; read $fh, my $data, 10; print "data: $data\n";
という感じに書きます。
Perlのsprintf [Perl]
あるデータからフォーマットして文字列を生成したい場合があります。その場合、C言語ではsprintfを使用する方法があります。
Perlにもsprintf関数がありますが、C言語と少し指定方法が違うようです。
C言語では、sprintf関数の引数に生成した文字列を格納させる文字列変数のポインタの指定をできます。しかし、Perlでは引数ではなく戻り値を代入する形になります。
例:
C言語では、
と書きます。
Perlにもsprintf関数がありますが、C言語と少し指定方法が違うようです。
C言語では、sprintf関数の引数に生成した文字列を格納させる文字列変数のポインタの指定をできます。しかし、Perlでは引数ではなく戻り値を代入する形になります。
例:
my $data = 123.45; my $str = sprintf "data: %d", $data;
C言語では、
int data = 123.45; char *str; sprintf(str, "data: $d", data);
と書きます。
Perlでデータの圧縮・非圧縮を扱う(zlib編) [Perl]
WOFFファイルは、OpenTypeやTrueTypeのフォントデータをzip圧縮にして格納しています。
PerlでWOFFファイル内のフォントデータを読み出し、OpenTypeやTrueType形式に変換する場合は、zip形式データを非圧縮形式(解凍)する必要があります。
Perlでzip形式を扱うには、Compress::Zlibモジュールを使用すると便利です。
Compress::Zlibのuncompress()メソッドは、zip形式を解凍するメソッドです。
このuncompressは、解凍が成功するとその戻り値はその結果が返され、失敗した場合、undefが返されます。
また、解凍しても元のデータに戻る(つまり圧縮されていない)場合もundefが返されるようです。
PerlでWOFFファイル内のフォントデータを読み出し、OpenTypeやTrueType形式に変換する場合は、zip形式データを非圧縮形式(解凍)する必要があります。
Perlでzip形式を扱うには、Compress::Zlibモジュールを使用すると便利です。
Compress::Zlibのuncompress()メソッドは、zip形式を解凍するメソッドです。
このuncompressは、解凍が成功するとその戻り値はその結果が返され、失敗した場合、undefが返されます。
また、解凍しても元のデータに戻る(つまり圧縮されていない)場合もundefが返されるようです。
use Compress::Zlib qw(uncompress); my $compressed_data =; my $uncompressed_data = Compress::Zlib::uncompress($compressed_data); if (define($uncompressed_data)) { print "Successed!\n"; } else { print "Failed.\n"; }
Perlでファイルパスから拡張子、ファイル名、ディレクトリを取得する方法 [Perl]
Perlでファイルパスから拡張子、ファイル名、ディレクトリを取得するには、
File::Basenameモジュールのfileparseを使用すると可能です。
例:
で、以下のように出力されます。
base name: image01, dir: /images/, suffix: png
File::Basenameモジュールのfileparseを使用すると可能です。
例:
use File::Basename "fileparse"; my $file_path = "/images/image01.png"; my ($base_name, $dir, $suffix) = fileparse($file_path, ".png"); print "base name: $base_name, dir: $dir, suffix: $suffix\n";
で、以下のように出力されます。
base name: image01, dir: /images/, suffix: png
Perlの配列のサイズを求める [Perl]
Perlの配列のサイズを求めるには、
scalar()関数を使用します。
例:
$#arrayでもサイズを求めることができます。この場合配列@arrayの最後の要素のインデックスを表しますので、サイズは$#array + 1で求められます。
scalar()関数を使用します。
例:
my @array = (1, 2, 3); print 'Length of @array: ' . scalar(@array) . "\n";
$#arrayでもサイズを求めることができます。この場合配列@arrayの最後の要素のインデックスを表しますので、サイズは$#array + 1で求められます。
Perlで文字列の部分文字列を取り出すには [Perl]
Perlで文字列の部分文字列を取り出すには、substr関数を使用します。
substr(取り出す先の文字列、取り出す位置、取り出すサイズ)
例:
sampleと出力されます。
substr(取り出す先の文字列、取り出す位置、取り出すサイズ)
例:
my $text = "This is a sample text."; print substr($text, 10, 6);
sampleと出力されます。
Perlで文字列を出力する [Perl]
Perlで文字列を出力するにはPHPのようなechoではなくC言語のようにprint関数を使用します。
「abcABC」と出力されます。
HTTPヘッダを出力する場合は、
とします。
printの他に、フォーマット付きのprintfも使えます。
print "abcABC";
「abcABC」と出力されます。
HTTPヘッダを出力する場合は、
print "Content-type: text/html\n\n";
とします。
printの他に、フォーマット付きのprintfも使えます。
Perlでオープンしたファイル全体を読み込む [Perl]
Perlでオープンしたファイルの全体を読み込む方法はいくつかあるようですが、
<ファイルハンドラ>を直接スカラー変数に代入するとファイル全体を読み込むことができるようです。
とすると読み込んだファイル全体が出力されます。
<ファイルハンドラ>を直接スカラー変数に代入するとファイル全体を読み込むことができるようです。
my $file_name = "./data.txt"; open my $fh, "<", $file_name die "Can't open the file $file_name: $!"; my $data = <$fh>; print $data;
とすると読み込んだファイル全体が出力されます。
Perlでファイルを操作する [Perl]
Perlでファイルをオープンする場合、以下のopen関数を使用します。
例:
ファイルオープン時にファイルが存在しない等のエラーが発生する場合があるので、openの結果をチェックしてプログラムを終了させることが普通です。
その場合、以下のようにdie関数を使用してエラーメッセージを表示させて、プログラムを終了させます。
ファイルのクローズは、close関数を使用します。
close ファイルハンドラ
例:
プログラムが終了するとPerlは自動で開いていたファイルをクローズするようですが、ファイル操作が不要となった時点でファイルクローズを行ったほうがいいと思います。
open file_handler, mode, file_path;
例:
open my $fh, "<", "../Data.txt";
ファイルオープン時にファイルが存在しない等のエラーが発生する場合があるので、openの結果をチェックしてプログラムを終了させることが普通です。
その場合、以下のようにdie関数を使用してエラーメッセージを表示させて、プログラムを終了させます。
open my $fh, "<", "../Data.txt" or die "File not found.";
ファイルのクローズは、close関数を使用します。
close ファイルハンドラ
例:
close $fh;
プログラムが終了するとPerlは自動で開いていたファイルをクローズするようですが、ファイル操作が不要となった時点でファイルクローズを行ったほうがいいと思います。
モダンPerlコーディングについて(その2) [Perl]
Perl5でローカル変数を使用する場合、必ずmyでローカル変数であることを宣言しておきます。
use strict;をファイルの最初に書いておくと、myで宣言せずに変数に代入したりすると、エラーとなります。
例:
use strict;をファイルの最初に書いておくと、myで宣言せずに変数に代入したりすると、エラーとなります。
例:
#!/usr/bin/perl use strict; use warnings; my $text = "version: 1.0.0"; print $text;