我对perl很新,但到目前为止,我到目前为止所做的一切都已经做好了。
我有一个格式如下的文件:
#IPAAS
@NX_iPaaS_AuthKey=dGstaG9zaGlub0BqcCasdpasdHN1LmNvbTppUGFhUzAw
@NX_iPaaS_href=live/661134565/process/75231
我想将以@NX_iPaaS开头的每一行读入类似的命名变量,例如: @NX_iPaaS_AuthKey会创建一个名为$ NX_IPAAS_AUTHKEY的新变量并保持该值,NX_iPaaS_href将导致一个名为$ NX_IPAAS_HREF的新变量带有值,依此类推?
- 更新 -
嘿伙计们,我需要对上述解决方案进行微调......
所以我刚刚发现我正在阅读的文件将包含“部分”,例如
----- SECTION=cr
NX_NTF_PERSISTENT_ID=cr:400017
NX_NTF_REF_NUM=45
----- SECTION=cnt
NX_NTF_PERSISTENT_ID=cnt:F9F342055699954C93DE36923835A182
您可以看到其中一个变量出现在两个部分中(因为我没有'next,除非已定义')导致前一个值被覆盖。有没有办法在NX_NTF_变量名称前加上每个部分顶部'section ='行提供的值?
由于
答案 0 :(得分:6)
好的做法是使用哈希。
my %hash;
while (<>) {
chomp;
my ($key, $value) = split /=/;
next unless defined $value;
$hash{$key} = $value;
}
请参阅Why it's stupid to "use a variable as a variable name",了解为什么使用变量变量名称不是一个好主意。
答案 1 :(得分:3)
您想要使用的是哈希。类似的东西:
use strict;
use warnings;
my $input = "yourfilename.txt";
open(my $IN, "<", $input) or die "$0: Can't open input file $input: $!\n";
my %NX_iPaaS_vars;
while (<$IN>) {
chomp;
if ($_ =~ /^\@NX_iPaaS/) {
my ($key, $value) = split(/=/, $_);
$NX_iPaaS_vars{$key} = $value;
}
}
要稍后使用变量,请使用$NX_iPaaS_vars{"name of variable you want"}
,例如:
my $href_path = $NX_iPaaS_vars{'@NX_iPaaS_href'};
# Do something with $href_path here...
答案 2 :(得分:-1)
#!/usr/bin/perl -w
use strict;
open(FILE,"test.txt");
my %hash;
foreach (<FILE>)
{
if($_=~/@(\S+)=(\S+)/)
{
$hash{$1}=$2;
}
}
close(FILE);
# Test Code
foreach (keys %hash)
{
printf("%s=%s\n",$_,$hash{$_});
}
如果变量名称是唯一的,则此解决方案很有效。