@EXPORTのシンボルリストにタイプ文字は必要?

このQ&Aのポイント
  • perlのモジュールでサブルーチンや変数をエクスポートする際、@EXPORTや@EXPORT_OKにリストを設定する必要があるかどうかについて疑問があります。
  • 検索してみると、文書によって異なる意見がありますが、実際に問題がないように見えます。
  • 一般的な慣例や影響についても教えていただけると嬉しいです。
回答を見る
  • ベストアンサー

@EXPORTのシンボルリストにタイプ文字は必要?

小さな疑問ですみません。 perlモジュールを作るとき、Exporterでサブルーチンや変数をエクスポートさせたい場合に、 @EXPORT = qw(A B C); などと@EXPORTや@EXPORT_OKに設定しますよね。 このとき、リストにはサブルーチンやスカラー変数や配列やハッシュなどのタイプ文字を付ける必要はあるのでしょうか。 @EXPORT = qw(&sub1 $scalar1 @list1 %hash1); というように。 いろいろ検索などして調べてみると、文書によって異なっていて、何も付けないのが多い、あるいは変数であることを明示するために変数には付ける、すべて付ける、などいろいろです。実際にも、動作には問題ないように見えます。 しかし@EXPORT自体はただのリストなので、「&」などを含んだ「文字列」として格納され、perlのシンボルテーブルではその部分がどのように扱われるのだろう…という疑問もあります。 付ける必要の有無、影響、一般的な慣例、など、ご教授のほどお願いいたします。

  • SV576
  • お礼率83% (40/48)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

関数の&は付けても付けなくても良いです。 他の場合は省略できません。 参考URLの"How To Export"を参照

参考URL:
http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/lib/Exporter.html
SV576
質問者

お礼

ありがとうございます。 実はこのために何時間も、あれこれ悩んでしまったのですが、おかげ様で、いともたやすく、あっけなく解決してしまいました…(苦笑)。 なぜこんな基本的なことを、もっと多くのマニュアルなどに書いておかないんでしょうかね。 と思ったら、Exporter.pmのDOCには載っていました…、完全に見落としていました、お恥ずかしい限り。 それにしても、やはり一般的な書籍や解説ページには、あまり載っていませんね。探し方が悪いのでしょうか。 それでは、ありがとうございました。

関連するQ&A

  • [perl]サブルーチンに渡す値が配列でもスカラーでも同様に処理できるようにしたい

    &test( [ X ] , [ Y ]); X:配列またはスカラー Y:スカラー のような形でサブルーチンに渡し、Xが配列であってもスカラーであっても新しい配列にpushしたいのですが、どうしてよいのか分かりません。 具体的には $a = 100; @b = qw/1 2 3 4 5/; $c = 500; のとき、 &test($a, $c);なら @array = qw/100/; $scalar = 500; &test(@b, $c);なら @array = qw/1 2 3 4 5/; $scalar = 500; のようにしたいのです。 なお、&test($a, @b, $c);のように引数を三つにして送る方法は仲間に却下されてしまいました。 なるべく引数は二つの方向でお願いいたします。

    • ベストアンサー
    • Perl
  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • リファレンスについて教えて下さい

          KEY     VALUE %hResult----RetCode ---- 0     ----Contents --- \%Hash1       KEY     VALUE %Hash1------MainContents--\@ArrayRef1    ------List     \%Hash2       KEY     VALUE %Hash2------NAME----------SCALAR1    ------TYPE----------SCALAR2 上のようなデータ構造をしている%hResultを サブルーチンから返却してきます。 %hResult から記述して、 1.ArrayRef1の要素を使用したい 2.SCALAR1,SCALAR2を使用したい のですが、記述が良く分かりません。 どなたか教えて頂けませんか?

    • ベストアンサー
    • Perl
  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • Perl ハッシュの値のリストをスカラーコンテキストで評価すると?

    こんにちわ。 初めての利用です。 Perlの事で質問なのですが、 my $score=($hash{"fred"},$hash{"barney"},$hash{"wilma"}); とすると$scoreにはキー「wilma」に対応した値が代入される様です。 リスト形式をスカラーコンテキストで評価すると、リストの要素数を返すと記憶していたので、この場合$scoreには3が代入されると思っていたのですが・・・。 試しに my @scores=($hash{"fred"},$hash{"barney"},$hash{"wilma"}); $score=@score; とすると$scoreに3が代入された様です。 この二つの式では一体何が違うのでしょう・・・?

    • ベストアンサー
    • Perl
  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • ハッシュキーの内容について

    こんばんは。perlをはじめて一ヶ月あまりの初心者です。 また疑問に思うことが見つかり、質問させていただきました。 以下のようなコードがあります。 ----------------------------------------- my @array = ( 'a','b','c'); my %hash; for (@array) {   $hash{$_}{OK} = 1;   $hash{$_}{WAVE} = 2;   $hash{$_}{Perl} = 3; } print $hash{a}->{OK}; print $hash{"b"}->{WAVE}; print $hash{c}->{"Perl"}; ----------------------------------------- 1、2、3を格納するときなのですが、 ハッシュのキーになる値(OK、WAVE、Perl)は、 ダブルクォートや、シングルクォートで囲っていません。 でも、エラーも発生せず、普通に実行できてしまいます("123"を表示します)。 ハッシュのキーは、 "OK","WAVE"や、'Perl'のように ダブルクォートや、シングルクォートで 囲む必要はないのでしょうか?? C言語みたいに厳密に型が決まっているわけではないので、 OKでも"OK"でもよいのかなー、という思いはあるのですが、、、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • hashをスカラー変数に渡す

    最近、perlを勉強し始めたのですが下記のようなサンプルコードを 見たことがあります。 hashをスカラー変数「$test」に渡している。そして「%$test」でhashに変換してeachで回している。最初から「%test」のようにしてeachで回せばよいと思うのですが実際の業務とかでhashをスカラー変数で受け取るようなことってありえるのでしょうか? my $test = { a=>'test_a', b=>'test_b', c=>'test_c' }; while( my ($key, $value) = each %$test ) { print $key ." : " . $value . "\n"; }

    • ベストアンサー
    • Perl
  • リストの最後の要素がリストリテラルの値になる?

    上級ウィザードを目指してプログラミングPerlを読んでいます! 53ページのリスト値の説明によると スカラーコンテキストでは、リストの最後の要素の値がリストリテラルの値になる。 とあり $stuff = ("one", "two", "three"); では、threeだけが変数$stuffに代入される。 とあります。 しかし、このコードを実際に試してみると $stuffにはoneが代入されました。 この本の記述が誤っているのでしょうか。 それとも私のやり方が何か間違っているのでしょうか。 誰か教えてください。

    • ベストアンサー
    • Perl
  • perlについて

    perlのなかにリファレンスの機能がありますが%hashって ハッシュがじぜんに定義されている状態で $fields=\%hash; $form{field}=$fields; $form{field}=$fields; $item=\%form; という構造の$item変数があります。 一行で$itemから%hashを呼び出す時の書き方 を教えてください。

    • ベストアンサー
    • Perl