如果我们处于以下情况:
var_TargetLine = var_MyString
我在数据库中有一个表 my $str = <<EO_STR;
Name=Value1 Adress=Value4
Name=Value2 Adress=Value5
Name=Value3 Adress=Value6
EO_STR
,其中包含列:"T1"
,并且我想将列("Name", "Address")
的值"Name"
放在列{{1} }值"value1,Value2,Value3"
在这种情况下,我们有:
"Adress"
我们如何将"Value4,Value5,Value6"
和my @matches = $str =~ /Name=(.*?)\nAdress=(.*?)\n/g;
与$1
一起使用,以便分别获得Name和Adresse的所有出现,以便将它们插入表$2
中? / p>
答案 0 :(得分:4)
所有匹配项的所有捕获都将返回,因此您必须将它们分组。
use List::Util 1.29 qw( pairs );
for ( pairs( $str =~ /Name=(.*) Address=(.*)/g ) ) {
my @matches = @$_;
...
}
也就是说,以迭代方式获取比赛更为普遍。
while ($str =~ /Name=(.*) Address=(.*)/g) {
my @matches = ( $1, $2 );
...
}
答案 1 :(得分:3)
Regex并非总是适合该工作的工具。您的数据看起来很像键/值对。使用split
进行分解。这里不需要模式匹配。
您的代码和数据不匹配,因此我不再使用代码中的内容。
use strict;
use warnings;
my $str = <<EO_STR;
Name=Value1
Adress=Value4
Name=Value2
Adress=Value5
Name=Value3
Adress=Value6
EO_STR
my $fields;
foreach my $pair (split /\n/, $str) {
my ($key, $value) = split /=/, $pair;
$key =~ s/^\s+//;
push @{ $fields->{$key} }, $value;
}
use Data::Dumper;
print Dumper $fields;
代码将创建以下数据结构:
$VAR1 = {
'Name' => [
'Value1',
'Value2',
'Value3'
],
'Adress' => [
'Value4',
'Value5',
'Value6'
]
};
您现在可以访问这两个数组引用,并使用它们将数据插入表中。
答案 2 :(得分:2)
我已经执行以下操作:
#!/usr/bin/env perl
use v5.28;
my $str = <<EO_STR;
Name=Value1 Adress=Value4
Name=Value2 Adress=Value5
Name=Value3 Adress=Value6
EO_STR
my @array;
for my $a (split(/\n/, $str)) {
my %res = $a =~ m/(\w+)=(\w+)/g;
push @array, \%res;
}
for my $a (@array) {
for my $b (sort keys %{$a}) {
"\n", <INPUT_FILE> ); say $b.'->'.$a->{$b};
}
}
它将创建以下结构:
@array = [
{
Name->Value1,
Adress->Value4
},
...
];