从第n次匹配中分配匹配变量

时间:2017-02-03 18:33:03

标签: perl

在接下来的代码中,我希望将$a$b设置为02 02(即$l中第二个匹配的值)如果我添加了行($a,$b)=($1,$2);,它可以工作,但如果可能,我宁愿在一行中完成。

有人能告诉我什么是错的吗?

#!/usr/bin/perl -w

my $l = "01:01 02:02";

my ($a,$b);

if ( ($a,$b) = ( ( $l =~ /(\d\d):(\d\d)/g)[1] ) ) {

  print "12 $1 $2\n";
  print "ab $a $b\n";

}

输出:

12 02 02
Use of uninitialized value $b in concatenation (.) or string at ./gs.pl line 11.
ab 01

1 个答案:

答案 0 :(得分:2)

首先,请勿使用$a$b作为变量名称。 sort使用了这些内容 - 如果您最终在同一范围内进行排序,您将开始怀疑会发生什么。

因此,由于缺少更好的名字,请试试$h$m

那么,现在,$l =~ /(\d\d):(\d\d)/g在列表上下文中返回了什么?它返回它找到的所有值:("01","01","02","02")。现在你明白为什么[1]没有得到你正在寻找的东西吗?

根据您正在做的事情,这可能就像使用[-2,-1]作为索引查找一样简单(总是得到最后两个)。或者可能是你想要遍历所有配对并做一些事情。没有足够的背景,但这应该给你一些想法继续下去。