2013-02-01 65 views
0

我对Perl很新,但到目前为止,我几乎需要做所有事情。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的新变量,并带有值等等?

--Update--

嗨,我需要需要对上述方案有轻微的调整...

所以,我才发现,原来我读会“的文件部分',例如

----- SECTION=cr 
NX_NTF_PERSISTENT_ID=cr:400017 
NX_NTF_REF_NUM=45 
----- SECTION=cnt 
NX_NTF_PERSISTENT_ID=cnt:F9F342055699954C93DE36923835A182 

你可以看到,其中一个变量出现在两个部分,其中(因为我没有“下一个定义,除非”)的前值结果被覆盖。有没有办法将NX_NTF_变量的名称加上每节的顶部'section ='行提供的值?

谢谢

+0

简单的状态机:读一行,找出它是什么,将它存储到适当的地方。起泡,冲洗,重复。 –

+7

你不想这样做。改为使用散列。 – melpomene

+0

任何例子都会很棒......我一直在6小时,复制n粘贴代码整天无济于事...... :) – shewang

回答

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... 
+0

uptownnickbrown,谢谢你的举例,但是这会抛出一个错误: 可能的意外在iPaaS2.pl第11行的字符串中插入@NX_iPaaS。 iPaaS2.pl第9行附近的语法错误,“”(“ ”)全局符号“@NX_iPaaS”需要在iPaaS2.pl第11行显式包名。 语法错误at iPaaS2.pl行15,在“}” 附近执行iPaaS2.pl由于编译错误而中止。 – shewang

+0

对不起,我只是在没有测试的情况下抛弃了它。作为刚刚编辑过的人,@需要在第11行的正则表达式中转义,如下所示:\ @。 – uptownnickbrown

+0

太棒了,就是它们......非常感谢您的帮助! – shewang

-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{$_}); 
} 

该解决方案行之有效,如果变量名是唯一的。

+2

请勿使用'-w';缺少'使用警告';不要使用裸号文件句柄;不要使用2-arg'open';检查“open”的错误返回值;不要使用'foreach(<...>)';避免'< >'; '$ _ =〜'是多余的; '\ S +'可能匹配'='(即你的正则表达式可能是错误的);没有很好的理由不要使用'printf'。 – melpomene

+0

为什么不是-w?和printf?为什么$ _ =〜多余? – Jean

+0

@Jean当您使用警告时,您可以选择禁用某些警告类别,例如, '没有警告'重新定义'。使用这个而不是'-w'开关被认为是最佳实践。 Perl字符串可以插入变量; 'print“$ _ = $ hash {$ _} \ n”'是等价的,并且具有较少的间接性。当需要高级格式化(在特定长度上切割字符串,对齐,舍入,十六进制...)时使用'printf'。如果一个正则表达式没有通过'=〜'绑定,默认情况下它与主题变量'$ _'匹配。 (<>)'一次读取所有行; 'while(<>)'一次一行。你的意思是正则表达式'/^\@([^=]+)=(.*)$/' – amon

相关问题