Perl将文件拆分为行和变量

Perl将文件拆分为行和变量,perl,parsing,Perl,Parsing,我目前正在拆分一个包含一些用户/密码信息的Perl文件,并成功地完成了这项工作,但对我的代码并不满意。我确信有更好的方法用Perl实现(我是初学者)。如果有人能想出一个更巧妙的方法那就太好了 my $i = 1; my $DB; my $DBHOST; my $DBUSER; my $DBPASS; my $filename = "some_file"; open(my $fh, '<:encoding(UTF-8)', $filename) or die "Could n

我目前正在拆分一个包含一些用户/密码信息的Perl文件,并成功地完成了这项工作,但对我的代码并不满意。我确信有更好的方法用Perl实现(我是初学者)。如果有人能想出一个更巧妙的方法那就太好了

my $i = 1;
my $DB;
my $DBHOST;
my $DBUSER;
my $DBPASS;    
my $filename = "some_file";
open(my $fh, '<:encoding(UTF-8)', $filename)
    or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
    chomp $row;
    if ($i == 1) {
        $DB = (split /=/, $row)[1];
    }
    if ($i == 2) {
        $DBHOST = (split /=/, $row)[1];
    }
    if ($i == 3) {
        $DBUSER = (split /=/, $row)[1];
    }
    if ($i == 4) {  
        $DBPASS = (split /=/, $row)[1];
    }
    $i++;
}
my$i=1;
我的$DB;
我的$DBHOST;
我的$DBUSER;
我的$DBPASS;
我的$filename=“一些文件”;
open(my$fh,“对于以下内容非常方便:

my ($DB, $DBHOST, $DBUSER, $DBPASS) = map {$_ =~ /.*?=(.*)/} <$fh>;
my($DB,$DBHOST,$DBUSER,$DBPASS)=映射{$\u=~/.*?=(.*)/};
发生了什么:

  • map()
  • 对于列表中的每个元素(本例中是一个文件行),将其分配到默认变量(
    $\uu
  • 然后,使用regex捕获我们想要的行的一部分,返回它,并将其分配给左侧的相关变量(在文件的每次迭代中,每个接收变量都会移位)
  • 正则表达式的操作如下:

    /
    *?#忽略一切,不贪婪,直到我们匹配一个
    =#我们的分隔符
    (#开始抓捕
    .#捕获所有内容直到行尾(减去换行符)
    )#结束捕获
    /

请注意,此解决方案将在整个文件中进行迭代,即使在填充了所有四个变量之后也是如此(就像您在OP中所做的那样)


还请注意,这里没有错误检查,因此如果没有捕获值,您将收到与未定义变量相关的警告。

我想我会删除您的单个变量,并将连接信息存储在散列中

my %db_conn;

while (<$fh>) {
  my ($key, $val) = split /=/, $_, 2;
  $db_conn{$key} = $val;
}
my%db\u conn;
而(){
my($key,$val)=拆分/=/,$,2;
$db_conn{$key}=$val;
}

当然,这是假设每行
=
左边的任何内容都是该值的唯一标识符。

可能是一个更好的地方,可以要求对有关严格、警告、关闭文件句柄和$i++的代码进行复查。在您的情况下,您使用的是什么数据库?最好的方法是让database服务器直接解析凭证文件。例如,MySQL和Postgres都有。哇,谢谢你,你能解释一下这里到底发生了什么吗?文档页面没有太大帮助。我可以看到“*?”匹配任何字符,0次或更多次(除了行终止符?),然后匹配“=”,然后再次匹配任何字符0次或更多次。然后map基本上对这些变量中的每一个都执行此操作?它如何获取“=”后面的值并将其分配给变量?@user2774695这就是正则表达式捕获的操作。它捕获等号后面的所有内容,这是返回的值,默认情况下是Perl正则表达式默认情况下,x与换行符不匹配…可以使用
/m
修饰符。请参见
映射{/=(.*)/}
*?
根本没有帮助。@Borodin:如果密码包含
=
怎么办?