read関数 - ファイルからバイト数を指定して読み込み



  1. Perl




  2. 関数



  3. here

read関数を使用すると、ファイルからバイト数を指定して読み込むことができます。

read $fh, $buffer, $byte_size;

第一引数は、ファイルハンドル、第二引数は、読み込んだデータを格納するスカラ変数、第三引数は、バイトサイズを指定します。

read関数を実行すると、第二引数で指定したスカラ変数に、指定したバイトサイズのデータが読み込まれます。

read関数に関する詳しい解説は公式ドキュメントをご覧ください。

read関数のサンプル

read関数のサンプルプログラムです。read関数を使ってファイルから8バイト読み込んでいます。

use strict;
use warnings;

# 読み込むファイルを開く
my $file = 'data.txt';
open my $fh, '<', $file
  or die "Can't open file $file: $!";

# read関数
my $buffer;
my $byte_size = 8;
read $fh, $buffer, $byte_size;

# 読み込んだデータを出力
print $buffer;



  1. Perl




  2. 関数



  3. here

sysread関数 - ファイルからバイト数を指定して読み込み(バッファリングなし)



  1. Perl




  2. 関数



  3. here

sysread関数を使用すると、ファイルからバイト数を指定して読み込むことができます。

sysread $fh, $buffer, $byte_size;

第一引数は、ファイルハンドル、第二引数は、読み込んだデータを格納するスカラ変数、第三引数は、バイトサイズを指定します。

sysread関数を実行すると、第二引数で指定したスカラ変数に、指定したバイトサイズのデータが読み込まれます。sysread関数はsyswrite関数と対になっています。

read関数との違いは、sysread関数においてはバッファリングがされないという点です。

sysread関数に関する詳しい解説は公式ドキュメントをご覧ください。

sysread関数のサンプル

sysread関数のサンプルプログラムです。sysread関数を使ってファイルから8バイト読み込んでいます。

use strict;
use warnings;

# 読み込むファイルを開く
my $file = 'data.txt';
open my $fh, '<', $file
  or die "Can't open file $file: $!";

# sysread関数
my $buffer;
my $byte_size = 8;
sysread $fh, $buffer, $byte_size;

# 読み込んだデータを出力
print $buffer;



  1. Perl




  2. 関数



  3. here

syswrite関数 - ファイルにバイト数を指定して書き込み(バッファリングなし)



  1. Perl




  2. 関数



  3. here

syswrite関数を使用すると、ファイルにバイト数を指定して書き込むことができます。

syswrite $fh, $buffer, $byte_size;

第一引数は、ファイルハンドル、第二引数は、書き込むデータであるスカラ変数、第三引数は、バイトサイズを指定します。

syswrite関数を実行すると、第一引数で指定したファイルハンドルに、指定したバイトサイズのデータが書き込まれます。

syswrite関数は、バッファリングを行わず、即座に書き込みを行います。syswrite関数はsysread関数と対になっています。

syswrite関数に関する詳しい解説は、公式ドキュメントを参考にしてください。

syswrite関数のサンプル

syswrite関数のサンプルプログラムです。syswrite関数を使って、文字列の長さ分書き込んでいます。

use strict;
use warnings;

# 書き込むファイルを開く
my $file = 'data.txt';
open my $fh, '>', $file
  or die "Can't open file $file: $!";

# syswrite関数
my $buffer = 'AGTC';
my $byte_size = length $buffer;
syswrite $fh, $buffer, $byte_size;



  1. Perl




  2. 関数



  3. here

scalar関数 - スカラコンテキストで評価



  1. Perl




  2. 関数



  3. here

scalar関数を使用すると、スカラコンテキストを強制することができます。

# スカラコンテキストで評価
scalar 実行文

たとえば配列をスカラコンテキストで評価すると配列の個数が取り出せますが、scalar関数を使って明示的に書くと以下のようになります。

# 配列の個数
my $count = scalar @values;
scalar関数は使わなくってよい?

プログラムを工夫して書けばscalar関数を使わないでプログラムを書くことができます。

たとえば、サブルーチンの引数に値を渡す場合は、変数を経由して渡すようにします。

# 配列の個数を直接渡す
foo(scalar @values);

# 配列の個数をスカラ変数に保存してから渡す
my $count = @values;
foo($count);

変数名を上手につけると自己説明的になって、プログラムが読みやすくなります。多くの場合は、scalar関数を使うよりは、変数に一度代入してから、他の場所で使うのがお勧めです。



  1. Perl




  2. 関数



  3. here

配列の要素数を取得する



  1. Perl



  2. 配列


  3. here

配列の要素数を取得するには、配列スカラコンテキストで評価します。

my $length = @nums;

配列の要素数というのは、配列の長さ、配列の要素の個数とも呼ばれます。

Perlにおいては、長さを取得する関数のようなものはなく、配列をスカラコンテキストで評価することで、配列の要素数を取得することができます。

一番簡単な方法は、上記のように、スカラ変数に代入することです。こうすれば、@numsはスカラコンテキストで評価されて、$lengthに配列の要素数が代入されます。

スカラコンテキスト



  1. Perl




  2. 構文




  3. コンテキスト



  4. here

Perlにはコンテキストと呼ばれる概念があり、スカラとして評価される文脈をカラコンテキストといいます。

スカラ変数への代入

スカラ変数への代入はスカラコンテキストです。配列はスカラコンテキストで評価すると、配列の長さを返します。

my $num = @values;
比較演算子の項

比較演算子の左右の項はスカラコンテキストです。

$x < @values
$x == @values

for文のループで頻繁に目にします。

for (my $i = 0; $i < @nums; $i++) {
  ...
}
ifの条件部

ifの条件部はスカラコンテキストです。以下では@valuesはスカラコンテキストで評価されるので、配列の個数を返します。

if (@values) {
  ...
}



  1. Perl




  2. 構文




  3. コンテキスト



  4. here

リストコンテキスト



  1. Perl




  2. 構文




  3. コンテキスト



  4. here

Perlにはコンテキストと呼ばれる概念があり、リストとして評価される文脈をリストコンテキストといいます。

配列への代入

配列への代入はリストコンテキストです。

my @values2 = @values;
リスト

リストの内側はリストコンテキストです。

(@values);
無名配列生成子

無名配列生成子の内側はリストコンテキストです。

[@values];
無名ハッシュ生成子

無名ハッシュ生成子の内側はリストコンテキストです。

{@values};

自動的に展開されて、気が付きにくい場所ですので、注意してください。

サブルーチンの引数

サブルーチンの引数は、リストコンテキストです。

func(@values);

自動的に展開されて、気が付きにくい場所ですので、注意してください。



  1. Perl




  2. 構文




  3. コンテキスト



  4. here