yasuさんの真似ではありませんがPerlについてお聞きしたいことがあります。

[上に] [前に] [次に]
じぇい [E-Mail] 1999/05/14(金) 00:47:55
え〜と、まずはじめにローカル変数についてなんですが、よくサンプルのスクリプトなどを見るとサブルーチンの中ではよくローカル変数を使っています。あれは、単に変数のぶつかりを避けたり、サブルーチンの再利用のためだけなのでしょうか?
すなわち、別にサブルーチンの中で使う変数をローカルなものにしなくてもよいのでしょうか?
引数で値を渡してreturnで値を返すというのが場合によって面倒くさい場合には無理してローカル変数を使う必要はないのでしょうか?
Perl上級者の方などは普通はサブルーチンに引数を与えて、それをreturnで返すという風にするのが普通なのでしょうか?
教えてください。

あと、2番目の質問ですが、
open(IN, datafile.txt);
$a = <IN>;
と、やると、$aにはファイルに保存されている最初の一行が格納されるのでしょうか?(間抜けな質問をしてすいません。)

ふじ 1999/05/14(金) 01:29:20
ロ・踉札D詈竸瑤鮖箸錣覆う苳詞合、そのサブル・踉札船鵑糧突兩C和擦覆錣譴泙垢茲諭」
一度きりしか使わないことが決まっているよう瘢雹なものなら、
確かにロ・踉札D襪砲垢襪海箸發覆い隼廚い泙后」
#が、私はなるべくロ・踉札D訐觚世靴討靴泙い泙后Z箸げ鵑靴サ侏茲進C氈ネ慷「世C蕁゚逅察゚逅察゚逅サ

>2番目のケ遡
その通りです。

ふじ 1999/05/14(金) 01:33:17
おっと、派手に化けましたね(^^;

ローカル宣言をしない場合、そのサブルーチンの汎用性は失われますよね。
一度きりしか使わないことが決まっているようなものなら、
確かにローカルにすることもないと思います。
#が、私はなるべくローカル宣言してしまいます。使い回しが出来た方が便利だから・・・

>2番目の質問
その通りです。

じぇい [E-Mail] 1999/05/14(金) 02:37:44
どうもありがとうございました。

まあ、スクリプト自体には関係ないということですね。
ただ、今後改良したりするときにローカル変数を使ったほうが何かと便利ということですね、、?

あと、現在僕の作っているCGIスクリプトでは絶対に一回しか使わないと決めてるサブルーチンが結構あって、、また、ちょっとめんどうなこともあるんで、今はあまりローカル変数を使っていません。
プログラミングに慣れてきたら、その辺は勝手に自分の中で調整されていくのでしょうかね、、?(ローカル変数を使うべきときと別に使わないでいいとき。)

とりあえず今はローカル変数を使っていなくてもぜんぜん不自由感じないのでこのまま(サブルーチンであまりローカル変数を使わないまま)CGIスクリプトの製作を進めていこうと思っているのですが、、何かご指摘やアドバイスがあればお願いします。(後々困るぞ、、とか、、。)
、、、別にいいんですかね、、、?

無責任官庁 1999/05/14(金) 08:53:07
>絶対に一回しか使わないと決めてるサブルーチンが結構あって

一回しか使わないのなら、無理に別ルーチンにするコトないですね。(^_^;)

あと、変数の定義に関しては、ローカルかグローバルかで、
メモリの占有量が違いますので、そこでしか使わないようなら
なるべくローカルにしたほうが、サーバーにやさしいプログラム
になるでしょう。

じぇい [E-Mail] 1999/05/14(金) 23:29:47
どうもありがとうございます。

>一回しか使わないのなら、無理に別ルーチンにするコトないですね。
まあ、サブルーチンにしたのは読みやすさのためなんですけど。
あと、そこでしか使わない変数ということではなく、後で同じ変数を別のルーチンで参照したかったのでローカルにしないほうが簡単だな、、、と思ったので質問してみました。
なんかサブルーチンの中ではローカル変数を使うのが当たり前みたいな意識が僕の中にあって、どう考えてもグローバル変数を使ったほうが楽な場面でちょっと変な悩みがあったみたいです。
どちらのほうが適しているかというのはどうやらプログラミングに慣れていくうちにわかっていくような感じがしてきました。

あと、ついでなんですけど、すごい基本的な質問をしたいんですが、$_
というのはどういう場面で使うのでしょうか?

foreach $a (@b){
   $_ = aaa;
}

これって使い方違うんですか?(すごい基本的なことですいません。)

ああ、、後もうひとつお聞きしたいんですが、、、CGIスクリプトの中でURLを指定するときはいつも相対パスでいいんですか?サーバーによってフルパスじゃないといけなかったりするんですかね、、?

あと、よく $data = './data.txt'; というようなのがあるんですが、その ./ ってどういう意味があるんですか?
僕が利用しているサーバーでは $data = 'data.txt'; でいいんですがサーバーによってはだめだったりするんですか?

tre [E-Mail] 1999/05/14(金) 23:55:40
はじめまして、

foreach $a (@b){
$_ = aaa;
}
は意味が、、ないとたぶん思います。

foreach (@hoge) { #foreach $_ (@hoge) {と書いても同じ。
print; #print $_; と書いても同じ。
}
というふうに、省略して書くときに使う変数だとおもいます。

>ああ、、後もうひとつお聞きしたいんですが、、、CGIスクリプトの中でURLを指定するときはいつも相対パスでいいんですか?サーバーによってフルパスじゃないといけなかったりするんですかね、、?
これは、よくわかんないです・・
./ですが、これはカレントディレクトリを指定している(?)と思います。

じぇい 1999/05/15(土) 00:22:00
なるほど。
変数を省略した場合に自動的に$_という変数が与えられるということですね。(そういうことですか?)

あと、、すごい情けないことを聞きたいのですが、、カレントディレクトリ、、というのは、、?そのスクリプトを置いているディレクトリ、、ということですか?

また、./というのは別に省略してもかまわないものなのでしょうか?

tre [E-Mail] 1999/05/15(土) 00:28:25
$_を、省略できる場合とできない場合があります。
詳しくは、ラクダ本を読んでください(^^;
>あと、、すごい情けないことを聞きたいのですが、、カレントディレクトリ、、というのは、、?そのスクリプトを置いているディレクトリ、、ということですか?
その通りです。
省略してもかまわないと思います。

B-Cus 1999/05/15(土) 00:39:56
ファイル名の指定であれば省略してもいいですが、
 Ex. open(IN,"./file");
コマンド名の指定であれば省略しない方がいいです。
普通カレントディレクトリにはPATHが通っていないから。
 Ex. open(IN,"./command |");

# require "./jcode.pl"; も後者だったかな?
# @INCにはカレントディレクトリは含まれていないはず。

じぇい 1999/05/15(土) 01:15:49
なるほど。ありがとうございました。

./に関してはなんかややこしそうなのでとりあえずつけておいたほうが良さそうですね。^^;

じぇい 1999/05/15(土) 01:16:14
[[解決]]
なるほど。どうもありがとうございました。

./に関してはなんかややこしそうなのでとりあえずつけておいたほうが良さそうですね。^^;

S [E-Mail] [HomePage] 1999/05/15(土) 03:48:53
カレントディレクトリにあるプログラムを起動するとき、MS-DOS や
Win ではプログラムファイル名をパス名なしで入力しても動きます
が、UNIX の場合はちゃんとどこのプログラムファイルか教えてやら
ねばなりません。そこで、./ をつけて「カレントディレクトリだ
よ」と教えます。

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