Regex 将值放入变量perl

Regex 将值放入变量perl,regex,perl,Regex,Perl,我有一根这样的绳子 destination: 29231, 280646, 9.715e-2, 60, 109 use strict; use warnings; my $string = 'destination: 29231, 280646, 9.715e-2, 60, 109'; my @numbers = $string =~ /[^\s,]+/g; shift @numbers; print "$_\n" for @numbers; 我试着把每个数字放入变量中 if ($i

我有一根这样的绳子

destination: 29231, 280646, 9.715e-2, 60, 109
use strict;
use warnings;

my $string = 'destination: 29231, 280646, 9.715e-2, 60, 109';

my @numbers = $string =~ /[^\s,]+/g;
shift @numbers;

print "$_\n" for @numbers;
我试着把每个数字放入变量中

if ($i =~ m/^destination:\s(\d+)\,\s(\d+)\,\s(\d+\.\d+\e-\d+)\,\s(\d+)\,\s(\d+)/){
$num1 = $1;
$num2 = $2;
$num3 = $3;
$num4 = $4;
$num5 = $5;
}

似乎
\s(\d+\.\d+\e-\d+\
不起作用,我哪里做错了

找到了,只是在\e上出错


正确的表达式应该是:
\s(\d+\.\d+\w-\d+\

更好的方法是使用split函数。在这里,您可以将字符串拆分为由空格分隔的元素(
\s+
),如果它们是数字(
/^\d+/
),则可以将它们打印出来(或重命名它们,或其他任何形式)

印刷品:

29231
280646
9.715e-2
60
109

解决方案取决于字符串的格式,但您可以找到所有不是空格或逗号的字段,然后删除第一个字段,如下所示

destination: 29231, 280646, 9.715e-2, 60, 109
use strict;
use warnings;

my $string = 'destination: 29231, 280646, 9.715e-2, 60, 109';

my @numbers = $string =~ /[^\s,]+/g;
shift @numbers;

print "$_\n" for @numbers;
输出

29231
280646
9.715e-2
60
109

为什么
\e
?应该是
e
。你逃得太多了。不要只是一时兴起就逃跑。无论如何,转义
e
字母将使其匹配。我建议使用
^destination\s*:\s*(\d+),\s*(\d+),\s*(\d+)。\d+e-\d+),\s*(\d+),\s*(\d+)
来表示时刻。为什么要转义e和逗号?您确定要在每个捕获组中都这么具体吗?“e”是该值的幂次数字,它不是regexp,必须在变量中,比如$num3必须正好是9.715e-2@Rocker当你也逃跑的时候much@MarkSetchell:那为什么呢?@MarkSetchell:那我想你应该删除你的评论。我很担心它得到了五张赞成票。每当你写
split/\s+/,$string
,你几乎肯定想要
split',$string
。如果目标字符串以空格开头,那么前者将给您一个空字符串作为返回列表的第一个元素,而后者不会。这是我看到它时想到的第一件事。但是,我首先要做的是
$string=~s/destination:\s*/
删除前缀,然后
split/,\s*/$string