0

Linux では問題なく動作するが、この時点で Windows では失敗する perl スクリプトがあります。

$freq{total} = 0;
dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile";

$dictfileそれぞれのプラットフォームの適切な場所を指します。ファイルのパーミッションを変更して0666も解決しません。開くファイルは、 でエンコードされたテキスト ファイルですgb18030

トリックはありますか?Window で開くにはエンコーディングを宣言する必要がありますか? または、Windows 上の別の perl ディストリビューションかもしれません。ストロベリーパールを使用しています。

ありがとう。

4

1 に答える 1

0

編集:申し訳ありませんが、私が明白なことを述べている場合、私は質問を読み直しました。あなたが言う時

開くファイルは、gb18030でエンコードされたテキストファイルです。

プレーンテキストファイルのことですか?

もしそうなら、それはあなたの問題だと思います。dbmopenインデックス付きデータベースファイル用で、dbmopenperlプログラムの前回の実行で作成されたものが理想的です。プレーンテキストファイルの場合、ハッシュにバインドすることはできません。

私の以前の共鳴...

これは、Windows7x64で実行されているStrawberryperl5.12.1を使用するWindowsで機能します。どのWindowsPerlを使用していますか?インストールに少なくとも1つのDBMモジュールが含まれていることを確認してください。

役立つかもしれない他のいくつかのポイント:

  • $!ダイステートメントに含める必要があります。これにより、オープンに失敗した場合のエラーメッセージが表示されます。うまくいけば、あなたの質問に答えてください。
  • dbmopen%freqハッシュの内容をクリアするので、あなたは負けます$freq{total}(その0はあなたが気付かないかもしれないので)。通常のパターンは次のとおりです。 dbmopen、いくつかのハッシュ値を変更し、dbmclose

編集:

$!失敗した「システム」コールのエラーテストを含む変数です。したがって、オープンラインは次のようになります。

dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile: $!";

標準のDBMモジュールを確認するには、コマンドプロンプトから次のコマンドを実行します。

for %m in ( DB_File GDBM_File SDBM_File NDBM_File ODBM_File ) do @perl -M%m -e "print qq(%m: $%m::VERSION\n)"

私にとってそれは:

DB_File: 1.82
GDBM_File: 1.10
SDBM_File: 1.06
Can't locate NDBM_File.pm in @INC (@INC contains: C:/Nerd/StrawberryPerl/perl/site/lib C:/Nerd/StrawberryPerl/perl/vendor/lib C:/Nerd/StrawberryPerl/perl/lib .)
.
BEGIN failed--compilation aborted.
Can't locate ODBM_File.pm in @INC (@INC contains: C:/Nerd/StrawberryPerl/perl/site/lib C:/Nerd/StrawberryPerl/perl/vendor/lib C:/Nerd/StrawberryPerl/perl/lib .)
.
BEGIN failed--compilation aborted.

これは事実上、DB_File、GDBM_File、およびSDBM_Fileがあることを意味します。ただし、NDBM_FileまたはODBM_Fileではありません。dbmopen申し訳ありませんが、デフォルトでどのモジュールが使用されているかを確認する方法がわかりません。

個人的には常にuse特定のモジュールを使用し、tiedbmopenの代わりに演算子を使用します。

于 2011-05-06T15:11:18.613 に答える