• ベストアンサー

Perlにfunctionってないんですか?

超初歩的な質問ですみません。 今までJavaScriptやPHPを使ってきたので、関数はfunctionで記述していました。 今回Perlも覚えようと思って勉強していたらsubという見たことのない文字を見つけまして。 調べて見るとJavaScriptやPHPのfunctionと同じような働きをしているような印象を受けました。 そこでふとPerlにfunctionって無いのだろうかと思い、調べてみると以下のサイトを発見しました。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k04.htm これによるとfunctionはあるそうなのですが、ここに書いてある通りに記述してみるとエラーになりました。ちなみにGoogle検索で「Perl function」と入れるとこのサイトがトップに来ましたが、それ以下の検索結果でそれらしいものは出てきませんでした。 Perlでfunctionは存在するのでしょうか? するとしたらどのように使い、またsubとの違いはどのようなものなのでしょうか? 質問攻めで恐縮ですが、何卒宜しくお願い致します。

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

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

Perlには function なる名前の構文は存在しませんし, 220個くらいある予約語にもないはずです. fで始まるのは for/foreach くらいでしょうか 何かのモジュールで拡張するとあるのかもしれませんが 「function」なんて名前を使ったら白い眼で見られそうですね(^^; > http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k04.htm んーー・・・function以外にもまずい記述が あちこちにありますね. まず,@_ は引数ではなく,引数のリスト. また,Perlで配列 @hoge の各要素は $hoge[1]などであって @hoge[1] などではないです. #Perl 6だと @hoge[1] みたいになりますけど また,@_ そのものは参照渡しではありません. @_ の各要素 $_[0] などが参照です. したがって,@_ そのものを変えても問題ないのですが, $_[0] とかを変えると痛いことになります. sub hoge{ $_[0]=20; ##引数の$iへの別名になってるので$iを20にしてしまう @_=(1,2,3);##けど,@_そのものを変えても$iには影響なし } $i=100; print $i,"\n";###ここは100 hoge($i); print $i;##20になってしまう. Perlは「変数名」と「変数の実体」の束縛関係が柔軟というか ちょっと面白い仕組みなので,逆にこのあたりはややこしい。。。 また,Cでいう「staticローカル変数の宣言がない」・・・ こういいきってしまうのは問題のような気がします. #スコープとmyでできるので.

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

Perl では値を返すかどうかに関係なく sub を使います. ちょうど C で値を返すかどうかに関係なく「関数」と呼ぶようなもの. ちなみに Perl の場合, 「最後に評価した値」が返り値になります. なので, return は書かなくても OK です. もちろん, 「返す値」を明確にするためにあえて return を書くこともありますし, サブルーチンの途中でどうしても return するときには当然書かなければなりません.

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

Perlにfunctionなる命令の類は存在しませんし、 subが外の言語でのfunctionにあたると思って差し支えありません。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k04.htm こちらのページにsubの代わりのような記述の意味は解りかねます。