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