我对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
您可以看到其中一个变量出现在两个部分中,这(因为我没有"下一个,除非定义")导致以前的值被覆盖。有没有办法在每个部分顶部的"section="行上提供的值作为NX_NTF_变量名称的前缀?
谢谢
好的做法是使用哈希。
my %hash;
while (<>) {
chomp;
my ($key, $value) = split /=/;
next unless defined $value;
$hash{$key} = $value;
}
请参阅为什么"使用变量作为变量名称"是愚蠢的,为什么使用变量变量名称不是一个好主意。
你想使用的是一个哈希。 像这样:
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...
#!/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=%sn",$_,$hash{$_});
}
如果变量名称是唯一的,则此解决方案非常有效。