Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発
  1. Perl
  2. モジュール
  3. here

IO::ScalarArray - 標準入力の試験で活躍

今回は「IO::ScalarArray」を使った標準入力の自動試験について解説します。

1. 標準入力にデータを流し込む方法

標準入力 STDINは、入力用のハンドルであって、プログラムの中からここにデータを書き込むことはできません。

標準入力にデータ流し込むことはできないのですが、擬似的に試験を行うことができます。tie という仕組みを使用すれば標準入力から行を読み込む

<STDIN>

という記述を、データを変数から読み込むという記述に結びつけることができます。( ここでは詳しく解説しませんがkitsさんのtieでSTDINを置き換えるという記事で方法が解説されています。)

2. IO::ScalarArrayを使用した標準入力の試験

IO::ScalarArrayは tie の仕組みを利用して、標準入力にデータを流し込むような記述を可能にするモジュールです。以下のように使用します。

まず、標準入力に流し込みたいデータを配列で作成します。標準入力は改行がひとつの区切りですので、データの末尾には改行をつけます。

それをIO::ScalarArrayのnewに渡して、オブジェクトを作成します。その後、型グロブを利用して、STDIN が $stdin のエイリアスになるようにします。

use IO::ScalarArray;
{
  my @inputs = ("1\n", "2\n", "3\n");
  my $stdin = IO::ScalarArray->new(\@inputs);
  local *STDIN = *$stdin;
  # 試験の記述
}

(参考)local

3 標準入力の自動試験のサンプル

対話的に質問をするプログラムの試験です。question関数は、男かどうかをたずねる関数になっています。

use Test::More tests => 1;
use strict;
use warnings;

use IO::ScalarArray;

{
  my @answers = ("y\n");
  my $stdin = IO::ScalarArray->new(\@answers);
  
  local *STDIN = *$stdin;
  
  my $is_man = question();
  ok( $is_man, 'He is man');
}

# 男性かどうかを尋ねる関数
sub question {
  print "Are you man?\n";
  my $answer = <STDIN>;
  
  chomp $answer;
  my $is_man;
  if ($answer eq 'y') { $is_man = 1 }
  else { $is_man = 0 }
  
  return $is_man;
}

スカラー入出力を利用する方法

Perlのスカラー入出力という機能を利用するサンプルです。

use Test::More tests => 1;
use strict;
use warnings;

{
  my $inputs = <<"EOS";
y\n
n\n
EOS

  # スカラー入出力を利用する方法
  open my $stdin, "<", \$inputs;
  
  local *STDIN = *$stdin;
  
  my $is_man = question();
  ok($is_man, 'He is man');
  
  $is_man = question();
  ok(!$is_man, 'He is not man');
}

# 男性かどうかを尋ねる関数
sub question {
  print "Are you man?\n";
  my $answer = <STDIN>;
  
  chomp $answer;
  my $is_man;
  if ($answer eq 'y') { $is_man = 1 }
  else { $is_man = 0 }

  return $is_man;
}