あなたのモジュールがプラグマでない場合、すなわち、それは大文字の名前を使用して、コードが解析される方法を変更しません。
ハッシュの値はスカラーであるため、複数のサブルーチンをキーに割り当てる場合は、配列参照を使用する必要があります。
#! /usr/bin/perl
use warnings;
use strict;
{
package Helper;
my %helpers;
sub import {
my $class = shift;
my %SOME_CONFIG = %{ shift; };
for my $hashref (@_){
@helpers{keys %$hashref} = values %$hashref;
}
use Data::Dumper;
$Data::Dumper::Deparse = 1; # To show the code, as well.
warn Dumper \%SOME_CONFIG, \%helpers;
}
}
my %SOME_CONFIG = (field => 'and its value');
sub do_something {
warn "Doing something";
}
sub do_something_else {
warn "Doing something else";
}
Helper->import(
\%SOME_CONFIG,
{ first_helpers => [
\&do_something,
\&do_something_else,
] },
{ second_helpers => [
sub {
warn "Inside the 2nd helper";
},
] },
);
あなたは、それ自身のファイルにHelper.pmをヘルパーを入れた場合は、その後、ちょうど
use Helper (
\%SOME_CONFIG,
....
しかし、use
句は、%SOME_CONFIGはまだしていないときには、コンパイル時に処理されていることができますそれがBEGINブロックに定義する必要があります。あなたはまだ使用句でそれにアクセスできるように、しかし、ブロックの外にそれを宣言する必要があります:
池上が示唆されているように簡素化された
my %SOME_CONFIG;
BEGIN {
%SOME_CONFIG = (field => 'and its value');
}
:
をHelper.pmでは、ちょうど
%helpers = @_;
を行います
for my $hashref
の代わりに
メインプログラムでは、使用
use Helper(
\%SOME_CONFIG,
first_helpers => [
\&do_something,
\&do_something_else,
],
second_helpers => [
sub {
warn "Inside the 2nd helper";
},
],
);
'{first_helpers => ...、}、{second_helpers => ...}' 'でなければならない{first_helpers => ...、second_helpers => ...} '(適切に' import'を変更して) – ikegami