2010-06-30 42 views
1

我想弄清楚如何讀取perl中的java jar文件中的META-INF/MANIFEST.MF文件。我試圖使用Mail::Header來分離清單中的屬性。這工作正常,如果清單文件已經從jar中提取,但我想弄清楚如何提取清單到內存中,然後立即放入一個Header對象。這是我到目前爲止有:Perl:從Java .jar文件讀取MANIFEST.MF文件

my $jarFile = "MyJar.jar"; 
my &jar = Archive::Zip->new($jarFile); 

my $manifest = Archive::Zip::MemberRead->new($jar, "META-INF/MANIFEST.MF"); 

my $header = Mail::Header->new; 
$header->read(????); 

print $header->get("Class-Path"); 

我想不通其中的構造和/或提取/讀取功能用來讀取$清單文件句柄。 (我是perl的新手)

回答

1

MemberRead有一個非常愚蠢的API。它應該以兼容的方式給出實際的句柄或至少模擬IO::File(所以我們將它傳遞給Mail::Header的構造函數或至少能夠調用getlines method),但不是。

我們可以通過將文件內容暫時存儲在數組中來解決它的不兼容問題。

my @lines; 
{ 
    my $handle = Archive::Zip->new($jar_file)->memberNamed('META-INF/MANIFEST.MF')->readFileHandle; 
    while (defined(my $line = $handle->getline)) { # even $_ doesn't work!! what a piece of camel dung 
     push @lines, $line; 
    } 
} 

my $headers = Mail::Header->new([@lines]); 
print $headers->get('Class-Path'); 
+0

感謝daxim。適用於我。我試圖做的唯一的其他問題是* .jar文件列表的解析問題。清單在列表的隨機點中添加了額外的空格,所以這就是我所做的以':'分隔的jar文件列表。 (「。jar:」,split(「。jar」,join(「」,split(「」,$ headers-> get(「Class-Path」)))))。「。jar」; – Nikordaris 2010-07-01 15:03:56