2009-11-11 28 views
0

我的任務是將鏡像映射到新服務器上。舊網站有幾個Perl腳本,就我所能看到的內部而言(我對Perl一無所知,儘管我對編碼有很好的理解,特別是PHP/js /等)不依賴於舊的服務器。也就是說,當我嘗試運行這個腳本時,它通過查找數據庫文件來查找適當的文章文件,但它不檢索任何內容。移動一個perl腳本/ dbm到一個新的服務器,並移出dbm?

基本上,這是一個基本的舊的CMS,我解釋它,它在那裏搜索PAG文件的文件名並顯示它。我有點迷失在這裏。是否有一個原因,爲什麼鏡像不適用於新網站?我檢查了權限,我檢查了Perl安裝在相同的目錄下。我覺得它使用DBM因爲,according to another article,如果我看到這樣的命令:

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

它必須是DBM,對不對?

在相關說明中,是否有任何方法可以將PAG文件的信息與原始文件合併,而無需使用難以置信的複雜Perl腳本;即使用文件本身的信息重新創建100個文本文件,而不是單獨存儲?

編輯:感謝下面的第一個答案。你能解釋一下HASH可能是什麼,以及面具嗎?我已經重新檢查.pag文件(數據庫名稱)的確在前面在.pl文件中定義的位置,並且它是以二進制形式傳輸的。但不知何故,我不能讓它正確地打開它!

編輯3:好了,對不起,這是最後編輯:我使用的模具下面的代碼(Shwern),發現它沒有發現DB文件,儘管它在那裏(兩個文件articles.pag和文章。目錄,但變量只引用「文章」沒有擴展名)在正確的目錄和正確的權限...所以,這裏的問題是現在到底是怎麼回事?這些是不同版本的Perl嗎?或者我只是在做一些基本和愚蠢的事情?爲了記錄(是的,它的可怕)我還沒有shell訪問,雖然我正在處理它...我被要求這樣做,因爲我的「新網絡」技能,我當然不是合適的像perl和dbm之類的人,儘管我可以讀取這些文件並理解它們。作爲最終的建議,有沒有人知道(一個腳本或類似的東西)我可以問原始的服務器人員(誰不是編碼人員)做這個ASCII轉儲,或者是不符合要求?我需要將其轉換爲CSV並返回到文件中,以便我可以在另一個數據庫中重複使用它......呃真是一場噩夢!

回答

1

如果我正確地讀你的問題,你很難在新機器上打開數據庫。數據庫是否存在?

dbmopen方法的文檔可通過perldoc -f dbmopen(以及此鏈接獲取最新穩定的perl版本,5.10.1)在命令行上獲得。

正如您從文檔中看到的,dbmopen的第二個參數包含打開的文件名。在你粘貼的代碼中,它包含在標量變量$art_dbm中。所以你需要做的是尋找一些此變量的早期聲明(可能是從配置文件中加載,或者可能是硬編碼的)。然後,一旦你找到了那個數據庫,所有需要的就是將這個文件轉移到你的新機器上。

如果您需要更多的幫助解密代碼,請隨時用代碼片段編輯您的問題,我們可以從那裏開始。

(現在,如果你已經找到了數據庫,但你不能打開它,你還有其他的問題。它一直以來我處理然而,隨着PAG文件很長一段時間。)

1

你還能訪問原始機器嗎?

儘管您使用的是DBM文件,但實際功能可能來自多個實現之一,其中一些實現不兼容。我會用創建它的相同perl轉儲文件,然後用新的perl重新創建它。

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.db」。取決於實施。見下文。

另一種可能性是您的兩個Perls嘗試用兩種不同的DBM實現打開文件。 Perl可以在不同的機器上使用不同的DBM實現集進行編譯。 dbmopen()將使用第一個硬編碼(和歷史上的barnacled)列表。它實際上是一個圍繞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' 

文件中沒有內容,但也沒有錯誤。原來它創建了一個名爲tmpdbm的文件,而ndbm使用的是tmpdbm.db。我們來試試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 Unix的file實用程序也會給你一個好主意,它是什麼類型的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它不是一個字節順序的問題,不太常見的,現在幾乎所有的東西是86。

PPS正如你所看到的,使用DBM文件有點混亂。奇怪的考慮它應該只是一個磁盤哈希。

相關問題