ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

Perlサンプル10 外部ファイルのサブルーチンを呼ぶ

2019-09-03

「use ファイル名」で.pmファイルからサブルーチンを取り込みます。 .plファイルが大きくなりすぎたときに.pmファイルに追い出したり、 .pmファイルに入れた共用のサブルーチンを複数の.plファイルから呼び出すことができます。

呼び出す側のプログラムです。 「use Perlsample_010」で外部ファイルPerlsample_010.pmを取り込みます。

#!/usr/bin/env perl

use v5.26;
use utf8;
use strict;
use warnings;

use Encode::Argv;
use Encode::Locale;
use FindBin;

use feature "say";

use lib $FindBin::Bin;
use Perlsample_010;

use open IO => ":utf8";

say "This is the first executable statement.";
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

takoluka();

luka();

取り込まれるファイルです。 サブルーチンtakolukaとlukaを定義しています。

use utf8;
use feature "say";

sub takoluka {
	say "たこルカは俺の嫁";
}

sub luka {
	say "ルカ姐さんも俺の嫁";
}

say "I do not recommend this line.";

1;
I do not recommend this line.
This is the first executable statement.
たこルカは俺の嫁
ルカ姐さんも俺の嫁

use lib $FindBin::Bin

useで取り込むファイルがあるディレクトリ一覧(@INC)にプログラムがあるディレクトリを追加します。 このあとプログラムがあるディレクトリにある.pmファイルを指定できます。
「後で use や require が perl のデフォルトの検索パスにない モジュールを見つけられるように、perl の検索パスにディレクトリを追加するために 使われます。」
lib - コンパイル時に @INC を操作する - perldoc.jp

use Perlsample_010

外部ファイルPerlsample_010.pmを取り込み、実行します。 このとき、本体のプログラムは実行前なので外部ファイルの実行が先行します。 サンプルプログラムの中で「say "I do not recommend this line."」とある通り、外部ファイルにサブルーチン外の実行文を書くのはお勧めしません。 本体のプログラムの「say "This is the first executable statement."」よりも先に外部ファイルが実行されています。 またメッセージがアルファベットなのは本体でのコンソール出力への文字コード指定よりも先に実行されてしまう事情があります (漢字で出力するとWindows環境では文字化けします)。

takoluka() luka()

外部ファイルのサブルーチンを呼び出します。 本体のプログラムに宣言しているかのように呼び出すことができます。

1

取り込み処理が成功したかを外部ファイルの実行結果で返します。 最後の行に1と書けばバッチリです。 useは手の込んだrequireなので(ホントか?)とりあえずrequireをご覧ください。
「初期化コードの実行がうまくいったことを示すために、ファイルは真を 返さなければならないので、真を返すようになっている自信がある場合を除いては、 ファイルの最後に 1; と書くのが習慣です。 しかし、実行文を追加するような場合に備えて、1; と書いておいた方が良いです。」
Perlの組み込み関数 require の翻訳 - perldoc.jp
Perlの組み込み関数 use の翻訳 - perldoc.jp