-1

是否有任何 perl 正则表达式技巧可以正确识别并返回

  1. 包裹名字
  2. 包上游
  3. 包维护者版本

并且可以与任何 ubuntu/debian 软件包一起使用?(注:任何)

下面只是一个示例。例如,sipcalc-1.2.3-1将被解析为:

$1 = sipcalc
$2 = 1.2.3
$3 = 1

libapache2-mod_perl-2.3.4-ubuntu5会被解析为

$1 = libapache2-mod_perl
$2 = 2.3.4
$3 = ubuntu5

等等

包名和版本号是虚构的,在这里只是给出我需要的想法。并且,这也可以使用 split// 。
谢谢。

4

4 回答 4

1

如果您希望它们存储在单独的数组中,请使用:

#!/usr/bin/perl -w
use strict; 
use Data::Dumper;

    my @names = ('sipcalc-1.2.3-1', 'libapache2-mod_perl-2.3.4-ubuntu5', 'libapt-inst1.4-0.8.16~exp12ubuntu10.10','isc-dhcp-common-4.1.ESV-R4-0ubuntu5.8', 'libaprutil1-1.3.12+dfsg-3');

my (@var1, @var2, @var3);
foreach (@names) {
    my ($match1, $match2, $match3) = ($_ =~ /(.*)\-([\d\.]+)\W([a-z]*.*)/i);
        push @var1, $match1;
        push @var2, $match2;
        push @var3, $match3;
    }

print Dumper (\@var1);
print Dumper (\@var2);
print Dumper (\@var3);

输出:

 $VAR1 = [
          'sipcalc',
          'libapache2-mod_perl',
          'libapt-inst1.4',
          'isc-dhcp-common',
          'libaprutil1'
        ];
$VAR1 = [
          '1.2.3',
          '2.3.4',
          '0.8.16',
          '4.1',
          '1.3.12'
        ];
$VAR1 = [
          '1',
          'ubuntu5',
          'exp12ubuntu10.10',
          'ESV-R4-0ubuntu5.8',
          'dfsg-3'
        ];
于 2013-08-22T20:30:04.797 回答
0

在我的系统上执行 dpkg -l 后,我发现有很多看起来独特的案例。

任何成功的正则表达式都必须考虑以下情况:

libapt-inst1.4-0.8.16~exp12ubuntu10.10

libaprutil1-1.3.12+dfsg-3

isc-dhcp-common-4.1.ESV-R4-0ubuntu5.8

无疑还有其他一些奇怪的。

这些包的命名是否有某种指南?鉴于软件包的数量庞大,如果没有某种框架可以遵循,我认为不可能回答这个问题。

于 2013-08-22T20:50:01.110 回答
0
#!/usr/bin/perl
use strict;
my @packages=`rpm -qa`;
foreach my $package ( @packages )
 {
   print "Package $package \n";
   my @parts = split(/\-/, $package);
   my $last=$#parts;
   my $maint_ver=$parts[$last];
   my $ver=$parts[$last-1];
   pop @parts; pop @parts;
   my $package_name=join("-",@parts);
   if ($ver !~ /\d+.\d+/ )
      {
       print "package naming error: $package \n";
      }
   print "$package_name <-> $ver <->  $maint_ver \n";
 }
于 2013-08-22T21:06:50.813 回答
-1

“这也可以使用拆分//。” 好像有答案了...

编辑:快速正则表达式。我不确定包裹的所有可能形式是什么。

use Data::Dumper;

my $string1 = "libapache2-mod_perl-2.3.4-ubuntu5";

my @matches = $string1 =~ m/([a-z0-9\-_]+)-([0-9.]+)-([a-z0-9]+)/i;

print Dumper \@matches;


$VAR1 = [
      'libapache2-mod_perl',
      '2.3.4',
      'ubuntu5'
    ];
于 2013-08-22T20:27:00.403 回答