我一段时间以来一直在努力处理我的代码部分,但无法理解。似乎与如何处理$ 1有关,但我找不到任何相关的东西。
正则表达式找到16640021并将其分配到数组中的某个位置。
my @one;
my @two;
my $articleregex = qr/\s*\d*\/\s*\d*\|\s*(.*?)\|/p; # $1 = article number
my $row = " 7/ 1| 16640021|Taats 3 IP10 |14-03-03| | | 1,0000|st | | 01| | N| 0|";
if ($row =~ /$articleregex/g) {
$one[0] = $1;
}
if ($row =~ /$articleregex/g) {
$two[0] = $1;
}
print $one[0];
print $two[0];
哪个输出
Use of uninitialized value in print at perltest3.pl line 13.
16640021
似乎$ one [0]的指定会以某种方式干扰$ 2 [0]的指定。这对我来说似乎很奇怪,因为这两个变量及其名称不应该以任何方式进行交互
答案 0 :(得分:6)
这是因为您使用了if (//g)
而不是if (//)
。
//g
将pos($_)
[1] 设置为匹配停止的位置,或取消设置pos($_)
[1] 如果比赛不成功 [2] 。//g
在位置pos($_)
[1] 处开始匹配。例如,
$_ = "ab";
say /(.)/g ? $1 : "no match"; # a
say /(.)/g ? $1 : "no match"; # b
say /(.)/g ? $1 : "no match"; # no match
say /(.)/g ? $1 : "no match"; # a
这允许以下内容迭代匹配:
while (/(.)/g) {
say $1;
}
不要使用if (//g)
[3] !
$_
用于表示与之匹配的变量。/c
。while (//g)
,或者除非您使用if (//gc)
进行令牌化。