搜索字符串并将其保存在Perl中的数组中

时间:2016-12-01 06:54:02

标签: 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中的参数不是数字。 (它在我的数组中的所有字符串元素) 我知道我必须缺少一些基本语法,因为我正在使用在线教程编写代码。请纠正代码。

2 个答案:

答案 0 :(得分:0)

  

在寄存器的数组中存储完整行

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

请根据您的要求进行检查和修改。

答案 1 :(得分:0)

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

我想这是抛出你的&#34;代数在数组元素中不是数字的代码&#34;错误。

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

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

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

如果您确实想从数组中获取索引,请使用以下代码:

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