1

サイトを新しいサーバーにミラーリングする任務を負っています。古いサイトにはいくつかの Perl スクリプトがありますが、内部的に見る限り (Perl については何も知りませんが、コーディング全般、特に PHP/js/etc についてはかなりよく理解しています)、古いものに依存していません。サーバ。とはいえ、データベース ファイルを調べて適切な記事ファイルを見つけるこのスクリプトを実行しようとしても、何も取得されません。

基本的に、これは初歩的な古い CMS であり、私が説明したように、PAG ファイルでファイル名を検索して表示しました。私はここで少し迷っています。新しいサイトでミラーリングが機能しない理由はありますか? パーミッションを確認しました。Perl が同じ/usr/etcディレクトリにインストールされていることを確認しました。別の記事によると、次のようなコマンドが表示された場合、dbmを使用していると思います。

 dbmopen( %ARTS, $art_dbm, 0644 );
 $entry = $ARTS{$article_id};
 dbmclose( %ARTS );

それはdbmでなければなりませんよね?

関連するメモとして、信じられないほど洗練された Perl スクリプトを使用せずに、その PAG ファイルの情報を元のファイルとマージする方法はありますか? つまり、個別に保存するのではなく、ファイル自体にその情報を含む 100 個のテキスト ファイルを再作成しますか?

編集:以下の最初の回答に感謝します。その HASH とマスクについて説明できますか? .pag ファイル (データベース名) が実際に .pl ファイルで以前に定義された場所にあり、バイナリで転送されたことを再確認しました。それでも、どういうわけか、正しく開くことができません!

EDIT 3: OK、申し訳ありませんが、ここで最終編集:以下のダイ コード (Shwern) を使用したところ、DB ファイルが適切なディレクトリに存在するにもかかわらず (articles.pag と article.dir の 2 つのファイルですが、変数は拡張子のない「記事」のみを参照する)、その DB ファイルが見つからないことがわかりました。適切な権限があれば... では、ここでの質問は、一体何が起こっているのかということです。これらは異なるバージョンの perl ですか? それとも、基本的で愚かなことをしているだけですか?記録のために(はい、ひどいです)私はまだシェルアクセスを持っていませんが、私はそれに取り組んでいます...私は「新しいWeb」スキルのためにこれを行うように頼まれました.私は確かに適切ではありません.ファイルを読んで理解することはできますが、perl や dbm のような人です。最終的な提案として、元のサーバーの人々 (コーダーではない) にこれの ASCII ダンプを作成するように依頼する方法 (スクリプトなど) を知っている人はいますか? これを CSV に取り込んでファイルに戻して、別のデータベースで再利用できるようにする必要があります...なんて悪夢でしょう!

4

3 に答える 3

1

あなたの質問を正しく読んだ場合、新しいマシンでデータベースを開くのに苦労しています。そこにデータベースは存在しますか?

dbmopen メソッドのドキュメントは、perldoc -f dbmopenを介してコマンド ラインから入手できます(最新の安定した perl リリース 5.10.1 のこのリンクからも入手できます)。

ドキュメントからわかるように、 の 2 番目の引数にdbmopenは、開かれているファイル名が含まれています。貼り付けたコードでは、それはスカラー変数に含まれています$art_dbm。したがって、この変数の以前の宣言を探す必要があります (おそらく、構成ファイルからロードされているか、ハードコーディングされている可能性があります)。次に、その DB を見つけたら、そのファイルを新しいマシンに転送するだけです。

コードの解読にさらにサポートが必要な場合は、コード スニペットを使用して質問を自由に編集してください。そこから先に進むことができます。

(データベースを見つけたのに開けない場合は、別の問題があります.PAGファイルを扱ってから長い時間が経ちました.)

于 2009-11-11T23:11:20.693 に答える
1

まだ元のマシンにアクセスできますか?

DBM ファイルを使用していますが、その実際の機能はいくつかの実装の 1 つに由来する可能性があり、そのうちのいくつかは互換性がありません。ファイルを作成したのと同じ perl でファイルをダンプし、新しい perl で再作成します。

于 2009-11-12T05:19:07.910 に答える
0

うまくいかないことがいくつかあります。最も明白なのは、dbmopen() 呼び出しがファイルを開いていないことです。DBM ファイルが存在しない場合、dbmopen() が失敗するのではなく、新しいファイルが作成されるため、空に見える可能性があります。

その可能性を排除するには、DBM ファイルが存在し、読み取り可能であることを確認してください。また、dbmopen() が成功したかどうかも確認します。形式が間違っていると、(通常) エラーが発生します。

die "$art_dbm does not exist" unless -e $art_dbm;
die "Cannot read $art_dbm"    unless -r $art_dbm;
dbmopen( %ARTS, $art_dbm, 0644 ) or die "dbmopen of $art_dbm failed: $!";

残念ながら、dbmopen() は巧妙すぎて、それ自体が役に立ちません。「foo」を指定すると、代わりに「foo.db」が作成される場合があります。実装に依存します。下記参照。

もう 1 つの可能性は、2 つの Perl が 2 つの異なる DBM 実装でファイルを開こうとしているということです。Perl は、さまざまなマシンでさまざまな DBM 実装セットを使用してコンパイルできます。dbmopen() は、ハードコードされた (そして歴史的にフジツボで覆われた) リストの最初のものを使用します。実際にはAnyDBM_Fileのラッパーです。どの実装が使用されているかを確認できます...

use AnyDBM_File;
print "@AnyDBM_File::ISA\n";

それらが同じであることを確認してください。そうでない場合は、dbmopen を使用する前に問題の DBM ライブラリをロードします。 perldoc -f dbmopen説明します。

これがデモンストレーションです。最初に、dbmopen() のデフォルト値を確認します。

$ perl -wle 'use AnyDBM_File; print "@AnyDBM_File::ISA"'
NDBM_File

次に、dbm ファイルを作成して入力します。

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; $foo{23} = 42;  print %foo'
2342

読み取れることを示します。

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo'
2342

そして、別の DBM 実装を使用して読み取りを試みます。

$ perl -wle 'use GDBM_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo'

ファイルには何もありませんが、エラーもありません。ndbmがtmpdbm.dbを使用していたのに対し、tmpdbmというファイルを作成したことがわかりました。Berkeley DB を試してみましょう。

$ perl -wle 'use DB_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo'
Inappropriate file type or format at -e line 1.

少なくともそれはエラーになります。

最善の策は、元のマシンが使用している DBM 実装を把握し、dbmopen() 呼び出しの前にそのモジュールを使用することです。それは状況を静的にします。

PS Unixfileユーティリティでも、DBM のタイプを知ることができます。

$ file tmpdbm
tmpdbm: GNU dbm 1.x or ndbm database, little endian
$ file tmpdbm.db
tmpdbm.db: Berkeley DB 1.85 (Hash, version 2, native byte-order)

$dietyそして、ほとんどすべてが x86 になった今ではあまり一般的ではなく、バイト オーダーの問題ではないことを願っています。

PPS ご覧のとおり、DBM ファイルを使用するのは少し面倒です。単なるディスク上のハッシュであることを考えると奇妙です。

于 2009-11-12T05:19:23.493 に答える