【问题标题】:Extract everything before second last hyphen in Perl在 Perl 中提取倒数第​​二个连字符之前的所有内容
【发布时间】:2016-10-19 19:09:28
【问题描述】:

我正在尝试提取任何给定 rpm 中倒数第二个连字符之前的所有内容。我通过指定索引号来实现这一点,但是这不适用于具有不同数量连字符的字符串。我知道版本在最后一个连字符之后,版本在倒数第二个连字符之后,名称就是在那之前的所有内容。我怎样才能用 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

【问题讨论】:

    标签: perl join split


    【解决方案1】:

    您知道您需要将最后两项分开,发布和版本。

    my @items = split '-', $str;
    
    my $release = pop @items;
    my $version = pop @items;
    
    my $package_name = join '-', @items;
    

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

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

    【讨论】:

    • 谢谢@zdim!正则表达式单行是赢家
    • @MikeA 谢谢——正则表达式确实不错。直到“单线”变成试图编码一半宇宙的三线噩梦:)
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 2019-06-24
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      相关资源
      最近更新 更多