可以在if条件下比较部分字符串吗?

时间:2014-12-25 16:46:18

标签: regex perl

以下脚本执行我想要的操作,但它会使错误的连接两行额外的正则表达式。

第一个/之前的部分长度可以是任意长度,所以我不认为我可以使用substr() ......

问题

是否可以避免两个额外的正则表达式行并在if条件下执行?

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

my $a = "tank5/a/b";
my $b = "pool/a/b";

$a = $1 if $a =~ qr{.+?/(.+)};
$b = $1 if $b =~ qr{.+?/(.+)};

if ($a eq $b) {
    print "same\n";
}

2 个答案:

答案 0 :(得分:4)

你可以尝试:

print "same\n" if (last_part($a) eq last_part($b));
sub last_part { $_[0] =~ s{^.*?/}{/}r }

如果你没有5.14+,你必须使用一些有点儿的东西。

sub last_part { my ($s) = @_; $s =~ s{^.*?/}{/}; $s }

答案 1 :(得分:0)

  

第一个/之前的部分长度可以是任何长度,所以我   不要以为我可以使用substr()...

你可以:

use strict;
use warnings;
use 5.016;

my $a = "tank5/a/b";
my $b = "pool/a/b";

$a = substr $a, (index $a, '/');
say $a;
$b = substr $b, (index $b, '/');
say $b;

--output:--
/a/b
/a/b

使用匹配运算符(m //):

use strict;
use warnings;
use 5.016;

my $a = "tank5/a/b";
my $b = "pool/a/b";

my $regex = qr{
    (
       \/   #Literal '/', followed by...
       .*   #Any charcter 0 or more times.
    )
}xms;


if ($a =~ $regex) {
    my $match_a = $1;

    if ($b =~ $regex ) {
        my $match_b = $1;
        say 'the same' if $match_a eq $match_b;
   }
}