在Perl中的第二个连字符之前提取所有内容

时间:2016-10-19 19:09:29

标签: perl join split

我试图在任何给定转速下的第二个连字符之前提取所有内容。我通过指定索引号来实现此功能,但是这对于具有不同连字符数的字符串不起作用。我知道释放是在最后一个连字符之后,版本是在第二个连字符之后,并且名称是之前的所有内容。我怎么能用perl做到这一点?

这就是我目前所拥有的:

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

2 个答案:

答案 0 :(得分:3)

你知道你需要分开,发布和版本的最后两个项目。

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

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

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

或者,您可以使用正则表达式

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

答案 1 :(得分: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