2016-10-19 3 views
0

任意のrpmで2番目の最後のハイフンの前にすべてを抽出しようとしています。私はインデックス番号を指定してこの作業を行っていますが、これは異なる数のハイフンを持つ文字列では機能しません。私はリリースが最後のハイフンの後にあることを知っています、バージョンは2番目の最後のハイフンの後にあり、その名前はその前のすべてです。 perlでどうすればいいですか?Perlで2番目の最後のハイフンの前にすべてを抽出します

my $str = "rpm-python-4.8.0-55"; 
my $name = join '-', (split /-/, $str)[-4 .. -3]; 
my $version = (split /-/, $str)[-2]; 
my $release = (split /-/, $str)[-1]; 

print "Name: $name\n"; 
print "Version: $version\n"; 
print "Release: $release\n"; 

出力:

Name: rpm-python 
Version: 4.8.0 
Release: 55 

答えて

3

をあなたが最後の二つの項目分け、リリースおよびバージョンを必要と知っている

これは私が現在持っているものです。

my @items = split '-', $str; 

my $release = pop @items; 
my $version = pop @items; 

my $package_name = join '-', @items; 

それとも、あなたは正規表現

my ($package, $version, $release) = $str =~ m/(.*)-([^-]+)-([^-]+)$/; 
+0

おかげで@zdim!正規表現の1つのライナーは勝者です –

+0

@MikeAありがとう - 正規表現は本当にいいですね。 "one-liner"が宇宙の半分をエンコードしようとする3行の悪夢に変わるまで: – zdim

2

別のアプローチを使用することができますが、正規表現です。次の例では、ハイフン、ハイフン、ハイフン、その他のハイフンに当たるまで、ハイフンを含むすべての情報を取得します。

use strict; 
use warnings; 

my @strings = qw(
    rpm-python-4.8.0-55 
    rpm-one-two-three-four-1.1.1-22 
); 

for (@strings){ 
    my ($name, $version, $release) = /(.*)-(.*)-(.*)/; 
    print "Name: $name\n"; 
    print "Version: $version\n"; 
    print "Release: $release\n\n"; 
} 

出力:

Name: rpm-python 
Version: 4.8.0 
Release: 55 

Name: rpm-one-two-three-four 
Version: 1.1.1 
Release: 22 
関連する問題