-1

パッケージのバージョンに基づいてパッケージをソートするために使用される次のPerlスクリプトがあります。

#!/usr/bin/perl -w
#
# Compare versions of all *.rpm files against the
# latest packages installed (if installed)
#
# Usage:
# rpmver.pl
# This script looks for all *.rpm files.
#
use strict;
use RPM2;
my $rpm_db = RPM2->open_rpm_db();
for my $filename (<*.rpm>) {
    my $h = RPM2->open_package( $filename );
    # Ensure we compare against the newest
    # package of the given name.
    my ($installed) =
      sort { $b <=> $a } $rpm_db->find_by_name($h->name);
    if (not $installed) {
        printf "Package %s not installed.\n", $h->as_nvre;
    } else {
        my ($result) = ($h <=> $installed);
        if ($result < 0) {
            printf "Installed package %s newer than file %s\n",
            $installed->as_nvre,
            $h->as_nvre;
        } else {
            printf "File %s newer than installed package %s\n",
            $h->as_nvre,
            $installed->as_nvre;
        }
    }
 } 

SRPMを備えたLinuxリポジトリがあります。最新のパッケージを別のディレクトリに移動したい。たとえばlatest_packages。スクリプトはどのように変更する必要がありますか?

4

1 に答える 1

1

まず、現時点で最新のすべてのパッケージ名を と呼ばれるハッシュに保存し%latest_packageます。次に、すべてのパッケージをチェックした後、ハッシュのキーをループし、それらの最新のパッケージを移動します。

} else {
    printf "File %s newer than installed package %s\n", ...
    $latest_package{$h->name} = $installed->as_nvre;
    ...
}

File::Copyモジュールのmove()メソッドを使用してファイルを移動します。他の IO システム コールと同様に処理することを忘れないでください (エラー テキスト変数dieの内容を含めてエラーが発生した場合、または を使用します)。$!autodie

foreach my $name (sort keys %latest_package) {
    File::Copy::move($latest_package{$name}, $LATEST_PACKAGE_DIR) 
        || die "Could not move $latest_package{$name} to $LATEST_PACKAGE_DIR: $!);
}

mkdir()必要に応じて関数を使用してディレクトリを作成します。

于 2012-04-08T01:35:25.330 に答える