串,正则表达式或其他方式来获得字符串

问题描述:

具体的数据我有以下内容的变量$配置(从文件加载了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做多线。

使用两个捕获组,我们抓取配对值(键/值),当我们将其分配给%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; 
+0

不幸的是,它仅匹配db_host。也许是newlinews人物的问题。 –

+0

上面的例子 - 它是可运行的,它的工作原理。如果你的输入差异很大,那么它可能不会,但这就是为什么我给出了这个例子。尝试运行'print Dumper $ conf;'(然后将结果粘贴到问题中)以查看它的匹配程度。 (一种可能性是报价内插) – Sobrique

+0

好了,现在可以使用。我删除了除了换行符之外的空格:s/[^ \ S \ n] + // g;来自输入字符串。 –