像這樣:
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;
不幸的是,它僅匹配db_host。也許是newlinews人物的問題。 –
上面的例子 - 它是可運行的,它的工作原理。如果你的輸入差異很大,那麼它可能不會,但這就是爲什麼我給出了這個例子。嘗試運行'print Dumper $ conf;'(然後將結果粘貼到問題中)以查看它的匹配程度。 (一種可能性是報價內插) – Sobrique
好了,現在可以使用。我刪除了除了換行符之外的空格:s/[^ \ S \ n] + // g;來自輸入字符串。 –