內容

名稱

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 將會重新建立原始的項目。

函式

new()

這會接收一個選用參數,.packlist 的名稱。如果檔案存在,它將會被開啟,並且檔案的內容將會被讀取。new() 方法傳回一個雜湊的參考。這個雜湊包含 .packlist 中每一行的項目。對於舊式 .packlist,與每個鍵關聯的值都是未定義。對於新式 .packlist,與每個鍵關聯的值是一個雜湊,包含 .packlist 中檔名後面的 key=value 成對。

read()

這會採用一個選用參數,也就是要讀取的 .packlist 的名稱。如果沒有指定檔案,將會讀取指定給 new() 的 .packlist。如果 .packlist 不存在,將會呼叫 Carp::croak。

write()

這會採用一個選用參數,也就是要寫入的 .packlist 的名稱。如果沒有指定檔案,將會覆寫指定給 new() 的 .packlist。

validate()

這會檢查 .packlist 中列出的每個檔案實際上是否存在。如果給定評估為 true 的引數,任何遺失的檔案都將從內部雜湊中移除。傳回值是遺失檔案的清單,如果所有檔案都存在,則會是空的。

packlist_file()

這會傳回關聯的 .packlist 檔案名稱

EXAMPLE

以下是 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);
	     }
	  }
       }
    }

AUTHOR

Alan Burlison <Alan.Burlison@uk.sun.com>