我需要在 - *,
之前提取所有字符串
例如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";
}
}
答案 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