Perl将文件拆分为行和变量
我目前正在拆分一个包含一些用户/密码信息的Perl文件,并成功地完成了这项工作,但对我的代码并不满意。我确信有更好的方法用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
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:如果密码包含=
怎么办?