Perlでのサブルーチン化(長文かも)

[上に] [前に] [次に]
”J” [E-Mail] 2000/06/07(水) 16:13:56
今、現在 C/C++を勉強しつつPerlをいじったりしてるのですが
よくCなどではプログラムが長くなったらひとつひとつの処理を関数化しろ
といったことがよく書かれてますが、Perlでも処理ごとにきちんと
サブルーチン化してあるものをよく見かけます。

Cの場合は関数内で宣言した変数はstatic変数など以外は
通常ローカル変数で関数が呼出された時に変数が生成され
その関数が終了するとその変数は消滅(?)しますよね。

でも、Perlの場合 サブルーチン内で変数を書いても
グローバルなものになってプログラムが終了するまで
その変数は残っているんですよね?

しかし、だからと言ってわざわざ全てのサブルーチンに引数を渡して
変数はローカルにしてと下記のように徹底的に
sub tekito {
    local($a, $b) = ($_[0], $_[1]);
    local($i,$j);

    for (i=0,j=0;i<10;i++) {
        ・・・・・・
    }
    ・・・・・
}
などとしてるのはそれほど見たことがありません。

それではサブルーチン化しても見易さなんかが向上しただけで
プログラミング上の(多少の)安全さみたいなのはあまり
向上してないように思います。

長くなりましたが結局のところ引数の利用、localやmyを使った処理が
何故それほど使われてないのか、その理由が知りたいのです。
localやmyを使うと処理が重くなる、負荷がかかるからなのか、
既にある変数を使いまわす方が効率がいいからか(安全<効率)、
言語の思想としてCやC++とは違い 簡単な用途として使われるから
それほど重視されてないのか、めんどうだからなのか、
私の考えてることが根本的に間違ってるのか・・・・・。

意味不明かもしれませんがニュアンスとフィーリングで読み取ってください。

B-Cus 2000/06/07(水) 16:59:08
> localやmyを使った処理が何故それほど使われてないのか
僕は使いますよ。use strict して、すべての変数を
my で宣言します。

ただし、他のファイルを require したりすると
そこでエラーになるのが、perl という言語の
いまいちなところではないかと思ってます。

Fuji.♪ [E-Mail] [HomePage] 2000/06/07(水) 17:08:03
全体で変数を使いまわす方が楽な人(Cでもグローバル変数を愛用する人)は使いまわしまくりますし、使いまわすのが嫌いな人(Cでもグローバル変数を極端に嫌う人)は可能な限り使いまわさないようにします。
要は書く人それぞれの主義ですね。

ただ、CGIスクリプトとしては速度や負荷の少なさなどの面が最優先とされる場合もあり、その場合には変数を削ったりする事はあるかと思います。
メンテなどの面を最優先にしても良いのであれば、やっぱりグローバルな変数は削って、読み易さ最優先で書くような気がしますが、あんまりPerlっぽくないかもしれないですね。(苦笑)

>簡単な用途として使われるから
簡単な用途!?
複雑な文字列処理をCで書く手間を考えて見ましょう。
数stepで済むPerlと何百step書いても終わらない可能性のあるCとでは話が大きく変わります。

#つ〜か、結構な処理が1lineで済ませちゃうこととかできるのは偉大です。

適した分野が違うものをそういう比較で一言で言い切るのはどうかな、と思います。

”J” [E-Mail] 2000/06/07(水) 23:27:19
[[解決]]
B-cusさん、Fuji.♪さんありがとうございます。

フリーで配布されているCGIスクリプトなんかを
いつも参考にしてるのですが 私が見てきたものには
あまりこういったことはされてないので
ずっと疑問に思ってました。

Cなんかはプログラミングスタイルって言うのでしょうか、
そう言ったことを書かれたホームページなどはありますが
Perlなんかではあまり見かけなくてローカル、グローバル
と言ったものにも触れられてるものも見かけるものがなかったので。

結局は書く人次第ということで、私はなるべくローカルと
グローバルを分けていきたいと思います。

で、「簡単な用途」って言うのはニュアンスとフィーリングでは
伝わらなかったみたいで、と言うより、私の言葉の使い方が
間違ってました。
Cだとややこしい複雑な文字列処理のようなものでも
Perlだと簡単なコーディング(?)って言うんでしょうか、
簡単に数行で書けたりします。

Perlを誰が作ったかは知らないのですが、その作者が
Perlを作り出す時に言語的な思想として
複雑な処理を簡単に済ませる、数行で済ませるから
グローバルとかローカルは重要視してないのかな、
と思ったわけです。

当然、そうなのかどうかは知りませんが「スクリプト」
という言葉から私が連想して勝手に思ってたわけです。
で、言葉足らずの言葉間違いで「簡単な用途」と
かなり省略したわけです。 (-_-;)

2000/06/08(木) 02:50:16
> Perlを誰が作ったかは知らないのですが、その作者が
> Perlを作り出す時に言語的な思想として
ちなみに、Perlを作ったのはLarry Wallという人です。
言語的な思想は「簡単なことは簡単に、難しいことは可能に」だそうです。

”J” [E-Mail] 2000/06/08(木) 08:55:01
なんか簡単そうで奥が深そうな言葉ですね。
作った人の考えを知るのも言語習得のうえで
大事と思うので 一度は勉強しようと思います。

ありがとうございました。

$$ 2000/06/10(土) 12:23:57
my()とlocal()はどうちがうのか?
use strict すると、どうゆうメリットがあるのか?
うーん。。

Fuji.♪ [E-Mail] [HomePage] 2000/06/10(土) 12:29:31
my()やlocal()と書くとそういう関数があるように見えてしまうのでアレですが、ラクダ本を読みましょう。

[上に] [前に] [次に]