Perl解析配置文件,将regex转换为键、值

Perl解析配置文件,将regex转换为键、值,regex,perl,Regex,Perl,我想出了以下方法,首先读取文件,然后将其放入散列=用作分隔符的符号 sub get_config_value_by_key { my ( $module, $key ) = @_; my $config = &read_file_contents( $config_directory . '/' . $module . '/config' ); my %config = $config =~ /(.*)=(.*)/g; return $

我想出了以下方法,首先读取文件,然后将其放入散列<代码>=用作分隔符的符号

sub get_config_value_by_key {
    my ( $module, $key ) = @_;

    my $config = &read_file_contents(
        $config_directory . '/' . $module . '/config' );
    my %config = $config =~ /(.*)=(.*)/g;

    return $config{$key};    
}
它工作得很好,只是如果我的值中有等号(我使用它作为分隔符),那么它就不能正确地解析它

如何修复正则表达式以使其正常工作,在值中转义
=
符号

配置行的示例:


键1=某个值
key_2=某个值,带有符号,该符号将其打断。

我会使用这样的方法:

use warnings;
use strict; 
use Data::Dumper;

open my $in, '<', 'in.txt' or die $!;

my %data;
while(<$in>){
    my($key, $val) = split(/=/, $_, 2);  
    $data{$key} = $val; 
}

print Dumper \%data;

我会用这样的方式:

use warnings;
use strict; 
use Data::Dumper;

open my $in, '<', 'in.txt' or die $!;

my %data;
while(<$in>){
    my($key, $val) = split(/=/, $_, 2);  
    $data{$key} = $val; 
}

print Dumper \%data;

你可以使用非贪婪量词

my %config = $config =~ /(.*?)=(.*)/g;
                          # ^_________ match smallest possible amount of chars

你可以使用非贪婪量词

my %config = $config =~ /(.*?)=(.*)/g;
                          # ^_________ match smallest possible amount of chars


调用函数时不要使用(&D)。。。这太没必要了!然后,除非你必须为家庭作业或高尔夫解决这个问题,否则我会研究split,而不是用一个regexp来解决所有问题。@polettix不,不是家庭作业,我这样做是为了我的真实主题(为Webmin)。Webmin经常在函数前面使用
&
。我还不是Perl专家。为什么将
&
用于?@Саа27谢谢,朋友!但总结是:只有当你有特定的理由这样做的时候,你才会这样做。即使这样,也不要考虑这样做,因为它可能不太清楚。不要使用和调用函数…这太没必要了!然后,除非你必须为家庭作业或高尔夫解决这个问题,否则我会研究split,而不是用一个regexp来解决所有问题。@polettix不,不是家庭作业,我这样做是为了我的真实主题(为Webmin)。Webmin经常在函数前面使用
&
。我还不是Perl专家。为什么将
&
用于?@Саа27谢谢,朋友!但总结是:只有当你有特定的理由这样做的时候,你才会这样做。即使这样,也不要考虑这样做,因为它可能不太清楚。(/=/,将在第二个或第三个
=
符号行中拆分,对吗?我想看看如何修复我的正则表达式。@IliaRostovtsev-这应该保留值字符串,因为它只拆分为两部分,在遇到第一个
=
拆分后将停止(/=/,
将在第二个或第三个
=
符号行中拆分,对吗?我想看看我的正则表达式可以如何修复。@IliaRostovtsev-这应该保留值字符串,因为它只拆分为两部分,在遇到第一个
=
符号后将停止。我也不会费心将配置转换为中间变量。This与
=~m/([^=]+)=(.*)/g;
(稍有不同的LHS,但这是一个品味问题)是的,我知道。我只是假设这就是
读取文件内容($filename)的方式
正在做。我会检查一下。谢谢,伙计们!@СС27谢谢,朋友!但是我不明白为什么。这个
真的做了什么?@IliaRostovtsev它使正则表达式变懒(在第一次
=
出现时停止匹配),我也不会费心将配置转换成中间变量。这与
=~m一样有效/([^=]+)=(.*)/g;
(稍有不同的LHS,但这是口味问题)是的,我知道。我只是假设这就是
读取文件内容($filename);
所做的。我会检查一下。谢谢,伙计们!谢谢!但我不明白为什么。
真的做了什么?@iliastovtsev它让正则表达式变得懒惰了(第一次出现时停止匹配
=