ExtUtils::Packlist - 管理 .packlist 檔案
use ExtUtils::Packlist;
my ($pl) = ExtUtils::Packlist->new('.packlist');
$pl->read('/an/old/.packlist');
my @missing_files = $pl->validate();
$pl->write('/a/new/.packlist');
$pl->{'/some/file/name'}++;
or
$pl->{'/some/other/file/name'} = { type => 'file',
from => '/some/file' };
ExtUtils::Packlist 提供管理 .packlist 檔案的標準方法。提供函式來讀取和寫入 .packlist 檔案。原始的 .packlist 格式是一個簡單的絕對路徑清單,每行一個。此外,這個套件支援一個延伸格式,除了檔名之外,每一行還可以包含一個屬性清單,格式為以空白分隔的 key=value 成對。例如,installperl 腳本使用這個格式來區分檔案和連結。
new() 函式傳回的雜湊參考可以用來檢查和修改 .packlist 的內容。可以透過修改雜湊來新增/刪除 .packlist 中的項目。如果與雜湊鍵關聯的值是標量,則任何後續 write() 寫入到 .packlist 的項目將會是一個簡單的檔名。如果值是一個雜湊,則寫入的項目將會是檔名,後面跟著雜湊中的 key=value 成對。讀回 .packlist 將會重新建立原始的項目。
這會接收一個選用參數,.packlist 的名稱。如果檔案存在,它將會被開啟,並且檔案的內容將會被讀取。new() 方法傳回一個雜湊的參考。這個雜湊包含 .packlist 中每一行的項目。對於舊式 .packlist,與每個鍵關聯的值都是未定義。對於新式 .packlist,與每個鍵關聯的值是一個雜湊,包含 .packlist 中檔名後面的 key=value 成對。
這會採用一個選用參數,也就是要讀取的 .packlist 的名稱。如果沒有指定檔案,將會讀取指定給 new() 的 .packlist。如果 .packlist 不存在,將會呼叫 Carp::croak。
這會採用一個選用參數,也就是要寫入的 .packlist 的名稱。如果沒有指定檔案,將會覆寫指定給 new() 的 .packlist。
這會檢查 .packlist 中列出的每個檔案實際上是否存在。如果給定評估為 true 的引數,任何遺失的檔案都將從內部雜湊中移除。傳回值是遺失檔案的清單,如果所有檔案都存在,則會是空的。
這會傳回關聯的 .packlist 檔案名稱
以下是 modrm
,一個乾淨移除已安裝模組的小工具。
#!/usr/local/bin/perl -w
use strict;
use IO::Dir;
use ExtUtils::Packlist;
use ExtUtils::Installed;
sub emptydir($) {
my ($dir) = @_;
my $dh = IO::Dir->new($dir) || return(0);
my @count = $dh->read();
$dh->close();
return(@count == 2 ? 1 : 0);
}
# Find all the installed packages
print("Finding all installed modules...\n");
my $installed = ExtUtils::Installed->new();
foreach my $module (grep(!/^Perl$/, $installed->modules())) {
my $version = $installed->version($module) || "???";
print("Found module $module Version $version\n");
print("Do you want to delete $module? [n] ");
my $r = <STDIN>; chomp($r);
if ($r && $r =~ /^y/i) {
# Remove all the files
foreach my $file (sort($installed->files($module))) {
print("rm $file\n");
unlink($file);
}
my $pf = $installed->packlist($module)->packlist_file();
print("rm $pf\n");
unlink($pf);
foreach my $dir (sort($installed->directory_tree($module))) {
if (emptydir($dir)) {
print("rmdir $dir\n");
rmdir($dir);
}
}
}
}
Alan Burlison <Alan.Burlison@uk.sun.com>