2016-12-01 79 views
-1

我的文本文件看起来像:搜索字符串,并将其保存在数组中的Perl

Register : STATUS 
FIELD:ON VALUE : 1 
FIELD:COMPLETE VALUE:0 

REGISTER : CONTROL<br> 
FIELD:SYSTEM_EN VALUE:1 
FIELD:CLOCK_EN  VALUE:0 

在这里,我要搜索REGISTER@register储存注册名称和搜索相应字段的名字和他们的价值观和保存它们。

这里是我试过到目前为止:

open(my $log, "<", "register.log"); 
my $reg_string = "Register"; 

while (<$log>) { 
    if (/reg_string/) { 
     my $str = $_; 
     my @registers = split//, $str; 
     print "\n $registers[3]\n"; 
    } 
} 

现在我试图访问数组元素在FOLL。方法:

while(<$log>){ 
my $str =$_; 
my @reg_string = split/\s+/,$str; 
push(@reg_value, $reg_string[4]); 
foreach my $i(@reg_value){ 
print " $reg_value[$i]"; 
} 
} 

但这个代码给我错误 参数不是数组elememt数字。 (它是我数组中的所有字符串元素) 我知道在使用在线教程编写代码时,我必须缺少一些基本语法。请纠正代码。

+5

你有没有对自己尝试新鲜事物?请显示你的努力。 –

+1

人们总是乐于帮助你进行计算,但你必须付出一些努力,比如试图自己解决问题,然后人们会帮助你显示出错的地方。 –

+0

这是字段,哪个值是你的例子? – ssr1012

回答

1

存储全线数组中的寄存器

use strict; 
use warnings; 
my (@full_line,@only_values) =(); 
while(<DATA>) 
{ push(@full_line, $_=~m/(register\s*\:\s*(?:[^\n]*))\n/i); } 
print join "\n", @full_line; 

Output: 
Register : STATUS 
REGISTER : CONTROL<br> 
在阵列中的分号的寄存器

存储的值

while(<DATA>) 
{ push(@only_values, $_=~m/register\s*\:\s*([^\n]*)\n/i); } 
print join "\n", @only_values; 

Output: 
STATUS 
CONTROL<br> 


__DATA__ 
Register : STATUS 
FIELD:ON VALUE : 1 
FIELD:COMPLETE VALUE:0 

REGISTER : CONTROL<br> 
FIELD:SYSTEM_EN VALUE:1 
FIELD:CLOCK_EN  VALUE:0 

请检查和修改根据您的需要。

+0

感谢您的帮助。虽然它不是我正在寻找的,但你的代码给了我一些实现我想要的东西的方法。现在我遇到了使用foreach循环访问数组元素的问题。请帮助 – ibrahim

1
foreach my $i (@reg_value) { 
    print " $reg_value[$i]"; 
} 

我想这是抛出你的“参数不是数组元素中的数值”错误的代码。

使用foreach这样的循环,每次循环时,$i将包含@reg_value中的一个元素。不是其中一个元素的索引,而是元素本身。试试这个:

foreach my $i (@reg_value) { 
    print " $i"; 
} 

请注意,我只是打印$i,而不是用它来查找数组中的元素。

如果你想从数组中得到索引,使用这样的代码来代替:

foreach my $i (0 .. $#reg_array) { 
    print " $reg_value[$i]"; 
}