在" - "之前从字符串数组中提取所有出现的字符串。在perl脚本中

时间:2015-02-23 11:32:57

标签: perl

我需要在 - *,
之前提取所有字符串 例如100002098和0004184022以及66680和1247764以及843804并附加到网址“www.xyz.com/mystring”

因为我已经写了下面的perl代码,但我在正则表达式中缺少一些东西,有人可以帮助我吗

my @str = ("100002098-2","0004184022-2","66680-2","1247764-2", "843804-0");  
foreach my $arr(@str){  
    if($arr =~ s/-.*//sr){  
        #url = append(url+$arr);
        print $arr. "\n";  
    }  
}

3 个答案:

答案 0 :(得分:7)

你很亲密。

您不需要sr作为正则表达式修饰符。我必须看看r做了什么:

  

r - 执行非破坏性替换并返回新值

http://perldoc.perl.org/perlre.html#Modifiers

在这种情况下,这将意味着您的'if'语句正在测试正则表达式的结果,但您实际上并未更改$arr。*

s看起来也无关紧要,但不是导致问题的原因:

  

取值   将字符串视为单行。也就是说,改变“。”匹配任何字符,甚至是换行符,通常它不匹配。

所以这应该有效:

my @str = ("100002098-2","0004184022-2","66680-2","1247764-2", "843804-0");  
foreach my $arr(@str){  
    if($arr =~ s/-.*//){  
        print $arr. "\n";  
    }  
}

另外 - 使用.附加在perl中。

E.g。 print $url.$arr或只是字符串化:print "$url/$arr\n";

*为了您的兴趣,您可以在正则表达式上使用r修饰符:

my @str = ("100002098-2","0004184022-2","66680-2","1247764-2", "843804-0");  
foreach my $arr(@str){  
    if(my $new_arr = $arr =~ s/-.*//sr){  
        print $new_arr. "\n";  
    }  
}

但我建议这是多余的,除非你特别想保留$arr的旧值。

答案 1 :(得分:1)

我会使用split将每个元素分成一个数组,其中包含-$split[0]之前的字符和$split[1]之后的字符。 然后你可以打印出来。我在打印后添加了if语句,仅在$split[0]$split[1]存在的情况下才打印数字。

#!/usr/bin/perl
use warnings;
use strict; 

my @str = qw(100002098-2 0004184022-2 66680-2 1247764-2 843804-0 1234 -5678);  
foreach (@str){
    my @split = split(/-/);
    print "$split[0]\n" if $split[0] and $split[1];
}

答案 2 :(得分:0)

仅仅因为总有不止一种方法可以做到这一点。如果你不想改变$ arr。这段代码......

my @str = ("100002098-2","0004184022-2","66680-2","1247764-2", "843804-0");  
foreach my $arr(@str){  
    if($arr =~ m/(.*)-.*/){  
        print "untouched: ". $arr. "\n";  
        print "extracted: " .$1. "\n";  
    }  
}

...给你......

untouched: 100002098-2
extracted: 100002098
untouched: 0004184022-2
extracted: 0004184022
untouched: 66680-2
extracted: 66680
untouched: 1247764-2
extracted: 1247764
untouched: 843804-0
extracted: 843804