【发布时间】:2017-03-14 05:57:21
【问题描述】:
第一个 if ($line =~ ...) 语句返回正确的匹配项 ($1),它被分配给 num。
第二个if ($line =~ ...) 语句没有返回任何值,因此没有为定义哈希分配任何内容。我单独测试了这个正则表达式语句,它确实返回了正确的匹配项 ($1)。
我希望将$definitions{$file}{$num} 分配给第二个正则表达式的返回值。
感谢您的帮助。我是 perl/regex 初学者。
my $dir = "/.../...";
my %definitions;
my $num;
opendir (DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
open FILE, "<$dir/$file" or die $!;
my @lines = <FILE>;
foreach my $line (@lines) {
if ($line =~ m/\', (.*?)\, /g) {
$num = $1;
}
if ($line =~ m/\'(.*?)\'/g) { # no match is found
$definitions{$file}{$num} = $1; # nothing is assigned
}
}
close FILE;
}
closedir DIR;
编辑:
数据文件示例:(其他文件比较长,这个是最短的)
('钠离子', 169, 183), ('ID 3006450 289000 - 440000', 10, 36)
我正在尝试提取单引号之间的内容并将其分配给定义,然后取第一个数字并将其分配给 num。
【问题讨论】:
-
您能提供文件中的示例行吗?
-
您的意思是,简而言之,第二个正则表达式没有找到在线模式。你能给我们看一些数据吗?还有许多其他的 cmets,但这是第一件事。
-
if ($line =~ m/\', (.*?)\, /g)代替if ($line =~ m/\', (.*?)\, /)和 ` if ($line =~ m/\'(.*?)\'/g)` 代替 ` if ($line =~ m/\' (.*?)\'/)` 可能会起作用。 -
我可能没有说清楚:你的正则表达式没有什么是错误的,所以让它不匹配。这意味着您的数据可能没有
'.*?'模式。另外,请注意.*也与 nothing 匹配,因此,如果您首先有''在线,那么这就是您将捕获的内容。 -
不应该
$CDE_instances是$definitions还是反之亦然?
标签: regex perl if-statement foreach hashmap