初めまして、自分でhpを持ちたく、Perlの勉強をしておりますパールマンと申します。
連想配列の連想配列で、下記のような
$nihon = {
'tokyo' => {
'setagaya' => 1,
'shibuya' => 1
},
'osaka' => {
'namba' => 1,
'kitashinchi' => 1
},
多次元連想配列を作ったとして、
この「%nihon」自体を削除したいのですが、どのようにしたら良いのでしょうか?
delete %nihon や undef %nihon としても、ループ処理でキーを取り出すと物が残っており困っています。
どうもこの多次元配列自体が「リファレンス」というもで、、、
delete %nihon や undef %nihon はスッゲェ見当外れ、つぅか%nihonは別モンですよ。みたいなとこまではボンヤリわかってきたのですが…。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
壱:print "$nihon{'tokyo'}{'nakano'}";
弐:print "$nihon->{'tokyo'}->{'nakano'}";
この二つは別の物です。
壱は$nihon{'tokyo'}->{'nakano'}
弐は$nihon->{'tokyo'}->{'nakano'}
です。
壱を${nihon}{'tokyo'}{'nakano'}
とすれば同じになります。
No.4
- 回答日時:
消え残りについて
Perlでは、その変数への参照がなくならないと確保されているメモリは解放れません。
なので、無名ハッシュのリファレンスが$nihonに代入されていて、
その内部の変数(メモリ)に他から参照がされていなければ、
$nihonをundefすることで、全体を解放することができます。
逆に言えば、なんらかの変数で、その内部に参照が残っていると、$nihonをundefしてもその内部の部分は解放されない場合があります。
おそらくは、そういうことではないでしょうか
例えば、以下のようにして試してみると、
undefの後で、ハッシュの中身が無くなっていることが確認できると思います。
#-------------------------------------------------------------------
$nihon = {
'tokyo' => {
'setagaya' => 1,
'shibuya' => 2
},
'osaka' => {
'namba' => 3,
'kitashinchi' => 4
}};
while(($key, $value) = each( %$nihon )){
print "$key:\n";
while(($k, $v) = each( %$value )){
print "\t$k:$v\n";
}
}
print "$$nihon{'tokyo'}{'shibuya'}\n";
undef $nihon;
while(($key, $value) = each( %$nihon )){
print "$key:\n";
while(($k, $v) = each( %$value )){
print "\t$k:$v\n";
}
}
無事解決致しました。皆様本当にありがとうございました。
悩んだ要因は、
tie (%nihon,'MLDBM',"nihon.db",$mode,0640);
として %nihon にデータベースを関連づけた場合、
print "$nihon{'tokyo'}->{'nakano'}"; で取り出せていたのですが、
このDBを
print FILE Dumper(\%nihon);
としてテキストファイルに出力していたものは、
$nihon = {'tokyo' => {'nakano' => 1,'shibuya' => 1},
'osaka' => {'namba' => 1,'kitashinchi' => 1},};
という宣言文で出力されており、
このテキストファイルを取り込んだ別のcgiだと
print "$nihon{'tokyo'}->{'nakano'}"; では取り出せず、
print "$nihon->{'tokyo'}->{'nakano'}"; でないと取り出せませんでした。
同様に
tie で 取り込んだcgiでは undef %nihon で消えていましたが、
Dumperしたテキストファイルから取り込んだcgiでは undef $nihon で消えるという状態でした。
tie したものも Dumper で取り込んだものもまったく同じもんだと思っていました。
違うんですね、ちょっと意外でした。
良い勉強になりました、リファレンスについて勉強したいと思います。
ありがとうございました。
No.3
- 回答日時:
#1お礼>print "$nihon{'tokyo'}{'nakano'}";
えっとですね。
$nihonに格納されているのは、"無名ハッシュへのリファレンス"であるということを頭においておいて下さい。
なので、
print "$$nihon{'tokyo'}{'shibuya'}\n";
の様にアクセスします。
undefされた後で、存在しないデータにアクセスをするとそのこと自体が、新しい変数(ハッシュ)を作ってしまうことになるので注意して下さい。
例えば、質問文のようなハッシュのキーと値を取り出すには、次のようにしてみると良いかも知れません。
while(($key, $value) = each( %$nihon )){
print "$key:\n";
while(($k, $v) = each( %$value )){
print "\t$k:$v\n";
}
}
No.1
- 回答日時:
$nihon に無名ハッシュのリファレンスが格納されているので、
undef $nihon;
とすることで全体のハッシュを削除できます。
この場合、%nihonは、別物です。
早速のご回答ありがとうございました。
試してみたのですが、なぜか消えるものと消えないものがございました…。
その法則性を探している時に見つけたのですが、
壱:print "$nihon{'tokyo'}{'nakano'}";
弐:print "$nihon->{'tokyo'}->{'nakano'}";
このような2種類の書き方でprintしたときに、
壱の書き方じゃないと表示されない連想配列、
弐の書き方じゃないと表示されない連想配列、
はたまた壱でも弐でも表示されるものに分かれておりました。
何かに迷い込んだ気分です…。
壱と弐は同等と考えていたのですが、
違うのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 日本大学の英語って nihon universityですか? japanese university 4 2023/04/19 16:19
- 不動産業・賃貸業 賃貸審査に落ち続けています。 3 2022/05/11 19:32
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- PHP クラス 1 2022/08/08 15:12
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- 友達・仲間 高校の入学式の日は入学式以外に何かしますか?また、どうしたら友達を作れるでしょうか? 3 2022/03/30 01:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
ハッシュのハッシュを実現したい。
-
CPANの「Mail::Mailer」 Retur...
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
VBAで3秒だけ時間を止めたい
-
Javaでゲーム
-
UWSCの終了の仕方
-
VBのReturnの使い方
-
Do whileでExitせず、ループの...
-
二次元配列のインデックスについて
-
アクティブセルから、A列最終行...
-
VBAのautofilter、criteriaの配...
-
DoEventsが必要な理由について
-
DOSコマンドのループ内のTIMEコ...
-
ボタンが押された時にループか...
-
C言語 4) int 型配列 month を...
-
配列を初期化する時ってどうす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースでユーザーのパス...
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
まったく同じファイルのハッシ...
-
列挙型と連想配列の違いを教え...
-
ハッシュ値が一致したデータは...
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
UTF-8で書かれたJSPの日本語文...
-
チェックデジットについて
-
ハッシュマーク以降のアドレス取得
-
ハッシュリストって単にハッシ...
-
一意(ユニーク)かつ、ソート...
-
多次元連想配列の削除
-
英語でのシャープとコメの呼び...
-
perlで配列名を動的に作り出したい
-
連想配列のサイズ制限
-
ハッシュ値によるファイルの同...
-
全ての変数を初期化する方法は...
-
文字列をハッシュにしなければ...
おすすめ情報