2015-02-23 59 views
3

我需要提取所有字符串,例如:*,
100002098和0004184022和66680和1247764和843804,并追加到URL“www.xyz.com/mystring”在perl脚本的“ - ”之前从字符串数组中提取所有出现的字符串

因为我写了下面的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"; 
    } 
} 
+2

什么是'append'功能? – Borodin 2015-02-23 12:00:05

回答

1

我将使用分割到每个元件分离成一个阵列,在$split[0]-和字符之前包含字符在$split[1]后。 然后你可以打印出来。如果$split[0]$split[1]都存在,我在打印后包含if语句以仅打印数字。

#!/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]; 
} 
+0

谢谢,分裂在perl脚本中工作,对于其他脚本正则表达式是不错的选择, – user3224025 2015-02-23 18:49:13

7

你很近。

您不需要sr作为正则表达式修饰符。我不得不去寻找什么r也:

的R - 进行非破坏性的替代和返回新值

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

这将 - 在这种情况下 - 意味着你的“如果”声明正在测试正则表达式的结果,但实际上并没有改变你的$arr。*

s看起来不相关,但不是什么因果关系g您的问题:

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

+0

不要带走/ s;如果在 - 之后有新行,它肯定会被通缉。如果 - 是第一个字符,则/ r的建议与不使用/ r的工作不同。 – ysth 2015-02-23 15:16:05

+0

公平点。我专注于提供的源数据,但对于不同格式的东西的一些测试案例将是相关的。 – Sobrique 2015-02-23 15:21:57

+0

谢谢,这个解决方案正则表达式适用于任何脚本,而不仅仅是perl。 – user3224025 2015-02-23 18:50:24

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 
相关问题