はじめに

自分が書いたperlスクリプトにおいて、どんなサブルーチンを使っているのかを確認したいケースは結構あるのではないかと思います。

このページでは、perlスクリプトを利用して、perlスクリプトの中からサブルーチン名を抽出する方法について説明します。

実現方法

論より証拠、ということで、まずは実証するサンプルコードをご覧ください。

サンプルコード(getSubroutineName.pl)
sub fold
{
	my($aArray)=@_;

	my(@tResultArray)=();

	for(my($tCount1)=0;$tCount1<=($#$aArray);$tCount1++)
	{
		my($tIsExist)=0;

		for(my($tCount2)=0;$tCount2<=($#tResultArray);$tCount2++)
		{
			if($tResultArray[$tCount2] eq $$aArray[$tCount1])
			{
				$tIsExist=1;
				last;
			}
		}

		if($tIsExist==0)
		{
			push(@tResultArray,$$aArray[$tCount1]);
		}
	}

	return @tResultArray;
}

my($aTargetFile)=$ARGV[0];

my(@tSubroutine)=();

open(DATA_FILE,'<'.$aTargetFile);
flock(DATA_FILE,1);
my(@tFileData)=<DATA_FILE>;
close(DATA_FILE);

my($tContent)=join('',@tFileData);

while($tContent=~ /\&([a-zA-z0-9_]{1,})\(/g)
{
	push(@tSubroutine,$1);
}

my(@tFoldedSubroutine)=&fold(\@tSubroutine);

for(my($tCount1)=0;$tCount1<=($#tFoldedSubroutine);$tCount1++)
{
	print $tFoldedSubroutine[$tCount1]."\n";
}
被抽出コード(sample.pl)
sub test1
{
	print 'subroutine test1 called!'."\n";
}

sub test2
{
	print 'subroutine test2 called!'."\n";
}

&test1();
&test2();
&test1();
&test2();

このサンプルコードで被抽出コードからサブルーチン名を抽出してみます。
実行結果は以下の通りです。

実行結果
$ perl getSubroutineName.pl sample.pl

test1
test2

このプログラムで一番重要なのは「while($tContent=~ /\&([a-zA-z0-9_]{1,})\(/g)」の部分で、「&hogehoge(」のようなサブルーチン呼び出しの箇所を抽出し、「hogehoge」の部分のみ配列に格納します。
また、perlスクリプトの中では同一のサブルーチンが複数回呼ばれる可能性があるため、foldサブルーチンを呼んで重複する呼び出しを畳み込んでいます。

制限事項

上記のサンプルコードでは「&hogehoge (」や「&hogehoge」のようなサブルーチンの呼び出し箇所を抽出することはできません。

もう少し正規表現部分を弄れば対応できると思いますので、トライしてみてください。

どんなことに使えるのか?

かなりの私は面倒臭がり屋なので、自分が作ったスクリプトでちょっとでも他のプログラムに転用できそうなものはサブルーチン化し、機能ごとに共通ライブラリとして保存しています。
この「共通ライブラリ」は結構便利なのですが、ちょっとしたシェルスクリプトを書くときに、使ってもいないサブルーチンが実装されたファイルをいちいちrequireするのはスクリプトの呼び出しのオーバーヘッド等もあり、あまり上手いやり方には思えません。

そうした時に、自分が書いたスクリプト内で使っているサブルーチンだけを共通ライブラリから切り出し、ひとつのファイルにまとめられたら便利ですよね。

上記のサンプルコードでは、「スクリプト内で呼んでいるサブルーチン名を抽出する」ことが出来ます。
こちらとあわせれば、利用しているサブルーチンのみ共通ライブラリから切り出すことが可能になりますので、是非ともお試しください。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。