>>950 openとlockの間に他プロセスからのopenが来たらどうするつもりなんだろう・・・。
>>165 別に問題ないのでは?
>openとlockの間に他プロセスからのopenが来たらどうするつもりなんだろう・・・。
とのことだけど、ファイルを破壊しているわけじゃないので無問題でしょ。
「他プロセスからのopen」がファイルを破壊したりflockを伴わなかったりしたら
そりゃ問題だけど、そんな赤信号を無視して突っ込んでくるヤツを止めることは出来ないし。
954 :
バカです:02/07/18 11:38 ID:w/uBOa7p
教えてください。
mySQLとPerl使っているのですが,ハッシュのことがよく分かりません。
while(@res = $st->fetchrow_array) {
$data{$res[0]}=1;
}
こうすると、ハッシュdataに何も入って無いのですが、↓の様にすると
ちゃんと、ハッシュに格納されます。何故ですか?
$i=0;
while(@res = $st->fetchrow_array) {
$data[$i]=$res[0];
$i++;
}
foreach(@data){$data{$_}=1}
955 :
nobodyさん:02/07/18 13:17 ID:pqv4qZv6
質問です。
sub A{
$a = "aaa";
&B;
}
sub B{
print $a;
}
&A;
サブルーチンAの中にサブルーチンBがある時、
Bの始めに引数の取得をしなくてもBの中で$aって使えるんでしょうか。
というか、今やったら出来たんですけど、どうしですか?
引数は必ず受け取らないとダメなんですよね?
956 :
nobodyさん:02/07/18 13:19 ID:pqv4qZv6
訂正。
>Bの始めに引数の取得をしなくてもBの中で$aって使えるんでしょうか。
Bの呼び出しの時に引数を与えなくてもBの中で$aって使えるんでしょうか。
>>955 だって、$aはmyなりlocalなりしてないのでスコープがグローバル。
もっともやってはいけないコーディング法の一つです。
>955
Perlはデフォでグローバル変数扱いになるから使える。
959 :
nobodyさん:02/07/18 13:25 ID:pqv4qZv6
やっぱり上のは違いました。質問し直します。
sub A{
&B;
}
sub B{
@array = @_;
print $array[0];
}
$a = "aaa";
&A($a);
この時、Aで引数を取得しないで飛ばしてBで取得しちゃってもいいんでしょうか。
@_ってローカルでは?
>>957 おいっ! my と local の違いを勉強せいっ!
この場合、local でも使えるだろ!
962 :
nobodyさん:02/07/18 13:37 ID:Rz8eDFr/
>>962 なかなか不便だね。
とにかく、彼はもうちょっと構造化プログラミングについて勉強した方が未来のためかと。
964 :
nobodyさん:02/07/18 13:42 ID:pqv4qZv6
謎はすべて解けた!
グローバル変数は引数を与えたり取得なんかしなくても
どこでも関係なく使えるってことだ!!
>>957 ネタ?
グローバルが最悪というが、状況次第だろ
それにこれはローカルが要求される程
莫大な規模ではないし
>>960 ダネ
Bが@_ではなく、$aで取得すれば問題ない
>>965 >グローバルが最悪というが、状況次第だろ
こんな小規模なプログラムかつ引数で渡せるものをわざわざグローバルにすべきではない。
俺いまだに、myとlocalの違いがわからねえ。
969 :
nobodyさん:02/07/18 13:45 ID:gTYoTB/P
>>964 どこでも使える=グローバル
局所でしか使えない=ローカル
972 :
nobodyさん:02/07/18 13:46 ID:gTYoTB/P
>>968 localだとそこから呼んだサブルーチンでも有効。
>>955だとlocalにしても使えるがmyだと引き渡されない。
なんとなく理解できたよ。
974 :
ぽよぽようんこ(本物):02/07/18 13:49 ID:HgQ+L8cQ
>>972 じゃあさ、
sub a
{
local($x);
&c();
}
sub b
{
&c();
}
sub c
{
print $x
}
ってした場合はどうなるの?
976 :
nobodyさん:02/07/18 13:52 ID:pqv4qZv6
bはどこで呼んでいるのだ?
>>976 どこかで読んだ場合よ。
localが呼び出しサブルーチンでも有効なら
場合によっては動かない組み合わせが出てくるだろうという話。
978 :
nobodyさん:02/07/18 13:58 ID:So56onuk
>>977 だから一般的にはmyを使って、サブルーチンは引数使って呼ぶのがお勧めです。
my $a;
$a = "aaa";
&a($a);
sub a{
&b;
}
sub b{
print $a;
}
これで、bの中の$aがちゃんと表示されちゃうんだけどなぜ。
$main::a だから
つーかaはやめれ
>>981 読んだけど聞きたいことが書いてなかったです。
>>982 それは、読んだだけでしょ?理解したの?
理解できたら解決できるよ〜
今まではサブルーチンに行く時は
必ず使う変数を渡すして受け取って使うものだと思っていたのに
そんなことしなくても使えることがわかったので混乱しています。
で、myを使えば他のサブルーチンでは使えないはずなのに
使えるからさらに混乱しています。
説明が悪すぎです。ここの人。混乱しています。
>979
ラクダ本p217より
このようなプライベート変数のスコープ内から呼び出されるサブルーチンからは
テキスト上で、サブルーチンがその変数のスコープ内で定義されている場合を除き
プライベート変数を見ることができない。
サブルーチンaおよびbがmy $aのスコープ内で定義されていますので、
表示されます。要するに仕様です。
>980
myで修飾された変数はパッケージ変数とは関係ありません。嘘は駄目です。
>>955 についてはまず基本を:
- use strict を使わないで使用した(宣言しなくても使用するだけでいい)Perlの変数は全て現在のパッケージのパッケージ変数になる。
- パッケージ変数は同パッケージ内ならどこからでも呼び出せる
以上を踏まえた上で元のコード(にちょっと手を加えたやつ)を
説明すると:
sub OUTER {
## この時点で$VARIABLEはパッケージ変数として宣言される
$VARIABLE = "aaa";
INNER();
}
sub INNER {
## OUTER()と同一パッケージ内なのでこの$VARIABLEもOUTER()で
## 宣言された$VARIABLEと同じ物を指す。よって"aaa"とプリントされる。
print $VARIABLE;
}
OUTER()
===
でも以上は悪いコードの見本みたいなもん。ちゃんとuse strictとmyを
使えば混乱しない:
use strict;
our $PACKAGE_VARIABLE = "foo";
sub INNER
{
my $inner_lexical_variable = shift;
print "PACKAGE_VARIABLE => $PACKAGE_VARIABLE\n";
print "LEXICAL_VARIABLE => $inner_lexical_variable\n";
}
sub OUTER
{
my $outer_lexical_variable = shift;
INNER( $outer_lexical_variable );
}
OUTER( "aaa" );
>>959 これは&SUBROUTINE;という表記がちょっと特殊だから起こる。
サブルーチン内で&SUBROUTINE;という表記でさらにサブルーチンを呼ぶと、
現在の@_の値をそのままそっくりSUBROUTINE()に渡す。
sub OUTER{ &INNER }
は
sub OUTER{ INNER(@_) }
と同じ事になるわけ。だから外側で呼んだサブルーチンの引数がそのまま
内側のサブルーチンで使えるわけ。これも特殊な状況でない限り使用は
お勧めしない。
>>975 これは実際に代入をしてみると差がでてわかる。
use strict;
my $GLOBAL = "ORIGINAL";
sub print_global
{
print "\$GLOBAL is $GLOBAL\n";
}
sub WITH_LOCAL
{
print "OUTSIDE of BLOCK\n";
print_global();
{
local $GLOBAL = "NEW VALUE";
print "local()ized \$GLOBAL\n";
print_global();
}
print "OUTSIDE of BLOCK (again)\n";
print_global();
}
>>954 >> while(@res = $st->fetchrow_array) {
>> $data{$res[0]}=1;
>> }
>> こうすると、ハッシュdataに何も入って無いのですが、
$st->fetchrow_arrayが、
(2ch, mona, giko)
というリストを返したとします。
2行目で
%dataの、key: 2chのvalueを1にしていますが、それ以外に何もしていません。
よって、2ch => '1' となるだけで、(それ以前に空なら)%dataには何も入りません。
>> $i=0;
>> while(@res = $st->fetchrow_array) {
>> $data[$i]=$res[0];
>> $i++;
>> }
>> foreach(@data){$data{$_}=1}
この場合は、カウントアップして繰り返しをやっていますので、配列dataの要素に順
番に格納されていきます。
2つめのブロックで、dataの要素をキーとした値をすべて1にしていますので、dataの
要素に格納された分だけ%dataに値が入ります。
しかしながら、上記のコードはまったく意味不明です。
fetchrow_arrayメソッドの仕様をお願いします。
994 :
バカです:02/07/18 18:04 ID:eilzvUxc
>>993 レスありがとうございます。
う〜ん、私にとっては、難しいいですね。基本的なこと分かってないみたいで、精進したします。
変な質問して申し訳ありませんでした。
fetchrow_arrayメソッドは、数字列が入っているだけです。
grep関数でこの数字列以外の配列を、取り出そうとしていた、だけなのですが
途中だけ経過だけ書いてしまいました。
すいませんでした。
995 :
名無し孫:02/07/18 18:36 ID:nyw/MMTK
996
997!
998!!
999!!!
1000 :
nobodyさん:02/07/18 18:43 ID:oI8Joy39
あ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。