DBモジュールを使ってちょっとしたDBを作ってるんですが、容量制限
らしきものでひっかかってます。そう、1024byteの壁です。これを越えると
sdbm store returned -1, errno 22, key "0012018" at ./hoehoe.pl line ~.
と叱られてしまうのです。

他にもODBMはもちろんのこと、NDBMも試しましたが結果は同じです。
容量制限のない GDBM、DB_Fileは大丈夫でした。
しかし SDBM、NDBMは 4096byteまで大丈夫だったはず。なにか別の方法が
あるのでしょうか?

今回の試しに以下のものを書いてみました。「3000」を「1000」くらいに
すると通ります。DB_File、GDBMでは「3000」でも大丈夫です。

----------------------------------------
use Config;
use Fcntl;
use SDBM_File;

$flags = O_CREAT|O_RDWR|&BINARY;
tie( %HOE, 'SDBM_File', 'hoe', $flags, 0666 ) || die "Can't open DB";
$uiui .= 'UIUI' while( 3000 > length( $uiui ));
$HOE{'key'} = $uiui;
untie( %HOE );
print "ok\n";
exit;

sub BINARY{
return O_BINARY if( $Config{osname} =~ /^(MS)?Win/ );
}

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ああ、SDBMだけじゃなくてNDBMにも制限が1kだけど?という質問


だったんですね。失礼しました。

私の使ってるOSはNDBMをGDBMでエミュレーションしてしまうので、
制限無しでした。

http://www.wwnet.net/~janc/incnote/dbm.html などのNDBMの項を見ると

> However, there is still a limit on the total size of the key/content pairs that can be stored
(this ranges from 1018 bytes to 4096 bytes).

とあるのでこれによると必ずしも4Kと限っているわけじゃなさそうです。
お使いのOSの環境にもよるんじゃないでしょうか。
    • good
    • 0
この回答へのお礼

なるほど、環境もしくは設定によって違ってくるのかもしれませんね。
もうちょっと調べてみたいと思います。ありがとうございました。

お礼日時:2001/05/14 03:27

perldoc AnyDBM_Fileでも、5.6.0で配布されているソース見ても、


制限は1024でしたよ。4096はdirの方ではないですか。

この回答への補足

http://www.din.or.jp/~abe/Perl5Man/AnyDBMFile.3p …
これによるとSDBMにはデフォルト「1k」で再定義可能
のようですね。といってもプロバイダなのでroot権限もって
ないからどうしようもないのですが。^^;

しかしNDBMは「4k」とあるのですが、これは1レコードのサイズ
とは違うのでしょうか? NDBMでもうまくいかないのです。

補足日時:2001/05/12 22:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Q{ブロック}の外でのみ use utf8; したいのだが・・・

連投申し訳ありません。
「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。
原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__

というプログラムを実行すると

C:\>list3.pl
カタカナカタカナ

と表示されてほしいのですが、

C:\>list3.pl
Cannot decode string with wide characters at C:/strawberry/perl/lib/Encode.pm li
ne 174.

と表示されます。

use utf8 を後ろにズラして

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加


{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8; # 移動
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__

とするとうまく動いて

C:\>list3.pl
カタカナカタカナ

と表示されます。

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;
my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動
print substr($text, 3, 4); # カタカナと表示されたい # 移動

{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

__END__

のようにするとやはり最初と同じエラーになりますが、

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;
my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動
print substr($text, 3, 4); # カタカナと表示されたい # 移動

no utf8; # 追加

{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

__END__

だと大丈夫です。

結果として、ブロックの外で use utf8;、中では use bytes; という記事の著者の意図通りに動作しないようで、ブロックの中まで use utf8; が効いているようです・・・。

これは Perl の実装が変わったのでしょうか。
使用しているのは Windows XP Home SP3+Strawberry Perl v5.10.0 です。

連投申し訳ありません。
「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。
原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUT...続きを読む

Aベストアンサー

「まるごとPerl」という書籍を所有していないので、そこでどのようなコードが
書かれているのかが分かりませんが、以下のように一旦、変数に格納するとうま
く動作するようです。

試した環境は、

OS:Windows XP SP2
Perl:ActivePerl 5.8.9

です。

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
# ブロックの外側ではバイトモードが強制される
use bytes;
my $text = '漢字、カタカナ、ひらがなの混じったtext';

#-- まず一時変数に代入 --------------------------
my $clipped_text = substr($text, 9, 12);
#------------------------------------------------

print Encode::decode('UTF-8', $clipped_text); # カタカナと表示されたい
}

my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__


下記エラー内容から推測して、

>Cannot decode string with wide characters at
>C:/strawberry/perl/lib/Encode.pm line 174.

内部表現の文字をdecodeしようとして失敗しているのではと思い、一旦、encode
してみました。

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
# ブロックの外側ではバイトモードが強制される
use bytes;
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print Encode::decode('UTF-8', Encode::encode('utf8', substr($text, 9, 12))); # カタカナと表示されたい
}

my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__

そうすると、エラーが出なくなったので、バイトストリームとしてではなく内部
表現のまま処理されているようです。

引数の中でsubstrを使った場合、use bytesが効いていないように見えます。
バグなのか仕様なのか、はたまた私の勘違いなのかはわかりません。

私より詳しい人が解明してくれるでしょう。

「まるごとPerl」という書籍を所有していないので、そこでどのようなコードが
書かれているのかが分かりませんが、以下のように一旦、変数に格納するとうま
く動作するようです。

試した環境は、

OS:Windows XP SP2
Perl:ActivePerl 5.8.9

です。

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
# ブロックの外側ではバイトモードが強制される
use bytes;
my $text = '漢字、カタカナ、ひ...続きを読む

Q@{$protocol_name}

usr strict;
をつかって、

$protocol_name = "pppoe";

@{$protocol_name}

のような使い方をしたいと思っていますが、

Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7

のようにエラー表示がでてしまいます。
どうしたら回避できるでしょうか。

Aベストアンサー

@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。

・ハッシュにハードリファレンスで格納する方法
$protocol{pppoe} = \@pppoe; # 代入
@{$protocol{$protocol_name}} # 参照
# @pppoeとしましたがもちろん無名配列でかまいません。

・分岐させる方法
if($protocol_name eq "pppoe"){
... = @pppoe;
}elsif ...

・シンボリックリファレンスだけ許可させる方法
no strict 'refs';

・%main::から引く方法
@{$main::{$protocol_name}}

Q$ENV{'HTTP_COOKIE'}は例えば

a=x;b=y;c=z;
のようなフォーマットになっているのでしょうか?
そうすると
自分のサイトが使っているクッキー名と
他のサイトが使っているクッキー名が偶然に一致していたとき
あるブラウザに書かれている自分のサイトのクッキーが
そのブラウザが他のサイトをアクセスしたときに上書きされてしまうのでしょうか?
そのためにクッキー名をつけるときには偶然に一致しないように一定の長さ以上で特異な名前にしたほうがいいのでしょうか?
クッキーについて基本的なことを教えてください

Aベストアンサー

Cookieは、ドメインごとに設定され、パスで出力先が限定されます。パス指定されない場合、ドメインのルートパスとなります。

おっしゃる通り、同一ドメイン内で設定されたCookieが、全てHTTP_COOKIEで取得出来ます。(無論ドメインが違うと駄目。)もしも、Cookieにパス指定がある場合は、そのパス以下では該当のCookieが取得可能、それ以上の階層では取得不可能になります。(デフォルトだとルートパスなので、ドメイン内のどの階層でも取得可能です。)

このような仕様の為、同一ドメイン・パス指定以下の階層で利用されるものでは、偶然一致してしまうと、他のクッキーを上書きしてしまう可能性はあります。他と重複しない用に、プログラム名等を含ませる形で名付けてあげると良いでしょう。また、共用サーバなどでは、パス指定で自分のホームを指定しておき、他の方のクッキーと混同されないようにする、等の配慮が必要になります。

Qドコモ携帯で$ENV{'HTTP_REFERER'}が表示されない。

ドコモ用のプログラムを作成しています。
環境変数の$ENV{'HTTP_REFERER'}をドコモのブラウザから
表示させたかったのですが、表示できません。ほかの環境変数は
表示できるのですが、なぜか$ENV{'HTTP_REFERER'}だけが表示
できません。ほかのキャリアでは表示できるのですが、なぜでしょうか?

どなたかご教授お願いいたします。

Aベストアンサー

DoCoMoの機種はREFERERを送出しないものが多いようです。
(REFERERはHTTP通信の規格上では必須項目ではありませんし、バグというわけでもないです。)

アクセス解析なんかで参考程度に参照するならともかく、
REFERERに依存したプログラムは書くべきではないようです。


人気Q&Aランキング

おすすめ情報