こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DBM::Deepでの配列がうまく動作しない

DBM::Deepでの配列がうまく動作しない
普段よくgdbmを使うのですが、DBM::Deepを使うと配列も使える人のことで試しているのですが、
ちょっと動作がおかしいです。私が何か間違えているかもしれませんので、一度見ていただければと思います。
---------------------------------
use DBM::Deep;
my @array;
tie @array, "DBM::Deep", "bar.db" ; # ★3
@array=(
[ "123" , "abc" ],
[ "456" , "def" ],
);

print qq($array[0][1]\n); # ★1

for my $ref(@array){
print "@$ref\n"; # ★2
}
---------------------------------
結果
---------------------------------
abc
---------------------------------

これを実行してみますと、★1はちゃんと表示されるのですが、★2が何も表示しません。どうもループにも入りません。。


ここで試しに★3をコメントにしてみますと・・
---------------------------------
結果
---------------------------------
abc
123 abc
456 def
---------------------------------

これはどういう事なのでしょうか?
DBM::Deepでは値の列挙ができない・・・のでしょうか。

それとも何か間違えていますでしょうか?

どうぞよろしくお願いします。

投稿日時 - 2010-09-27 12:31:00

QNo.6211307

すぐに回答ほしいです

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

連投すみません。

"自身"って...ほんと自信なくします。

あと、質問者さんのスクリプトはこちらではうまく動きました。

よって原因不明です。よく見もせずにすみませんでした。

ただ、インスタンスを捨ててしまっているので、データは保存されないのではないでしょうか?

投稿日時 - 2010-09-28 00:17:04

補足

すぐにお返事出来なくて申し訳ありませんでした。

いろいろ試してみたのですが、原因不明でした・・・

調べている過程でStoreableというのを知りまして
どうやらこちらの方が使いやすそうだったのでDBM::deepの使用はやめることにしました。

ご回答ありがとうございました。感謝です!

投稿日時 - 2010-10-03 20:51:42

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

こんにちは、
的を得ている自身はありませんが、

>tie @array, "DBM::Deep", "bar.db" ; # ★3

もしかして、インスタンスを捨ててしまっているからではないですか?

以下実験です。

#! perl
use strict;
use warnings;
use DBM::Deep;
use Data::Dumper;

#
my @array;
my $db = tie @array, 'DBM::Deep', 'foo.db';

@array=(
 [ "123" , "abc" ],
 [ "456" , "def" ],
);

print Dumper $_ for @array;

undef $db;


#
my $db2 = DBM::Deep->new(
 file => 'foo.db',
 type => DBM::Deep->TYPE_ARRAY
);

print Dumper $_ for @$db2;



--- 実行結果 ---
D:\>perl test.pl
$VAR1 = bless( [
  '123',
  'abc'
], 'DBM::Deep::Array' );
$VAR1 = bless( [
  '456',
  'def'
], 'DBM::Deep::Array' );
$VAR1 = bless( [
  '123',
  'abc'
], 'DBM::Deep::Array' );
$VAR1 = bless( [
  '456',
  'def'
], 'DBM::Deep::Array' );

投稿日時 - 2010-09-28 00:06:00