从字符串中获取特定数据的子字符串、正则表达式或其他方式
Substring, regexp or other way to get specific data from string
我有以下内容的变量 $conf(从具有 unix 编码换行符的文件加载):
db_host='127.0.0.1'
db_user='mail_channels'
db_name='mail_channels'
db_pass='kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
我想获取 db_host、db_user 等的值。分配给变量 $dbHost、$dbUser 等。我该怎么做?
注意:我无法逐行读取文件。 $conf 变量的内容是我从请求中得到的数据(我必须修改用 Perl 编写的API)。
像这样:
my %conf = $conf =~ m/^(\w+)=\'(.*)\'/gm;
例如:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $conf = q{
db_host='127.0.0.1'
db_user='mail_channels'
db_name='mail_channels'
db_pass='kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
};
print $conf;
print "\n---\n";
my %conf = $conf =~ m/^(\w+)=\'(.*)\'/gm;
print Dumper \%conf;
这给你:
$VAR1 = {
'db_user' => 'mail_channels',
'db_name' => 'mail_channels',
'db_host' => '127.0.0.1',
'db_pass' => 'kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
};
之所以有效,是因为 - 正则表达式中的 g
重复并且 m
执行多行。
通过两个捕获组,我们获取成对的值 (key/value),当我们将其分配给 %conf
哈希时,它会将它们视为键值对。
分解正则表达式:
my %conf = $conf =~ m/
^ #start of line anchor
(\w+) #word characters, one more
= #just a literal equals
\'(.*)\' #a quote either side of value
/gmx; #x allows whitespace in the regex
对于第二组,它将删除字符串中的引号。如果您需要保留它们,您可以改为:
my %conf = $conf =~ m/^(\w+)=(.*)/gm;
我有以下内容的变量 $conf(从具有 unix 编码换行符的文件加载):
db_host='127.0.0.1'
db_user='mail_channels'
db_name='mail_channels'
db_pass='kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
我想获取 db_host、db_user 等的值。分配给变量 $dbHost、$dbUser 等。我该怎么做?
注意:我无法逐行读取文件。 $conf 变量的内容是我从请求中得到的数据(我必须修改用 Perl 编写的API)。
像这样:
my %conf = $conf =~ m/^(\w+)=\'(.*)\'/gm;
例如:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $conf = q{
db_host='127.0.0.1'
db_user='mail_channels'
db_name='mail_channels'
db_pass='kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
};
print $conf;
print "\n---\n";
my %conf = $conf =~ m/^(\w+)=\'(.*)\'/gm;
print Dumper \%conf;
这给你:
$VAR1 = {
'db_user' => 'mail_channels',
'db_name' => 'mail_channels',
'db_host' => '127.0.0.1',
'db_pass' => 'kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
};
之所以有效,是因为 - 正则表达式中的 g
重复并且 m
执行多行。
通过两个捕获组,我们获取成对的值 (key/value),当我们将其分配给 %conf
哈希时,它会将它们视为键值对。
分解正则表达式:
my %conf = $conf =~ m/
^ #start of line anchor
(\w+) #word characters, one more
= #just a literal equals
\'(.*)\' #a quote either side of value
/gmx; #x allows whitespace in the regex
对于第二组,它将删除字符串中的引号。如果您需要保留它们,您可以改为:
my %conf = $conf =~ m/^(\w+)=(.*)/gm;