2015-10-07 81 views
0

具體的數據我有以下內容的變量$配置(從文件加載了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)。

回答

3

像這樣:

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;來自輸入字符串。 –

相關問題