我在数组中有类似下面的细节。在实际案例中将会有大量的测试细节。我想grep一个特定的testbed(TESTBED = vApp_eprapot_icr),如下所示的信息应该被复制到另一个数组中。我如何使用perl来完成这项工作?测试床末尾的信息可以通过闭合的花括号来理解。
TESTBED = vApp_eprapot_icr {
DEVICE = vApp_eprapot_icr-ipos1
DEVICE = vApp_eprapot_icr-ipos2
DEVICE = vApp_eprapot_icr-ipos3
DEVICE = vApp_eprapot_icr-ipos5
CARDS=1GIGE,ETHFAST
CARDS=3GIGE,ETHFAST
CARDS=10PGIGE,ETHFAST
CARDS=20PGIGE,ETHFAST
CARDS=40PGIGE,ETHFAST
CARDS=ETHFAST,ETHFAST
CARDS=10GIGE,ETHFAST
CARDS=ETH,ETHFAST
CARDS=10P10GIGE,ETHFAST
CARDS=PPA2GIGE,ETHFAST
CARDS=ETH,ETHFAST,ETHGIGE
}我会让它更简单,请看下面的数组
@array("
student=Amit {
Age=20
sex=male
rollno=201
}
student=Akshaya {
Age=24
phone:88665544
sex=female
rollno=407
}
student=Akash {
Age=23
sex=male
rollno=356
address=na
phone=88456789
}
");考虑像这样的数组。这样的条目很多。我需要grep,以学生=Akshaya的数据为例。从开始的'{‘到结束的'}’,所有信息都应该复制到另一个数组中。这就是我要找的。
发布于 2016-11-11 21:27:57
while (<>) {
print if /TESTBED = vApp_eprapot_icr/../\}/;
}作为附注,<>将捕获您在cmdline上使用的文件名。因此,如果数据存储在一个文件中,您将从命令行运行
perl scriptname.pl filename.txt发布于 2016-11-12 16:26:16
好的。我们终于有了足够的信息来给出答案。或者,至少产生两个答案,这两个答案将在您的输入文件的稍微不同的版本上工作。
在评论中,您说您正在创建数组,如下所示:
@array = `cat $file`;由于几个原因,这不是一个很好的主意。首先,当cat将为您读取文件时,为什么还要运行像Perl这样的外部命令。其次,这为输入文件中的每一行提供了数组中的一个元素。如果您将其安排为每个TESTBED = foo { ... }记录都是一个数组元素,事情就会变得简单得多。
让我们先去掉cat。将单个文件读入数组的最简单方法是使用文件输入运算符- <>。它将从命令行上给定名称的文件中读取数据。所以如果你把你的程序叫做filter_records,你可以这样叫它:
$ ./filter_records your_input_data.txt然后读入一个数组,如下所示:
@array = <>;这很好,但是我们仍然将输入文件的每一行都放在它自己的数组元素中。我们如何解决这个问题取决于输入文件的确切格式。最简单的方法是在输入文件中的每条记录之间有一个空行,如下所示:
student=Amit {
Age=20
sex=male
rollno=201
}
student=Akshaya {
Age=24
phone:88665544
sex=female
rollno=407
}
student=Akash {
Age=23
sex=male
rollno=356
address=na
phone=88456789
}Perl有一个名为$/的特殊变量,它控制如何从输入文件中读取记录。如果我们将其设置为空字符串,那么Perl将进入“段落”模式,并使用空行来分隔记录。所以我们可以像这样写代码:
{
local $/ = '';
@array = <>;
}请注意,将对Perl的特殊变量的更改本地化总是一个好主意,这就是为什么我将整个过程包含在一个裸露的块中。
如果没有空行,事情就会变得稍微困难一些。我们将读取整个文件,然后将其拆分。
下面是没有空行的示例文件:
student=Amit {
Age=20
sex=male
rollno=201
}
student=Akshaya {
Age=24
phone:88665544
sex=female
rollno=407
}
student=Akash {
Age=23
sex=male
rollno=356
address=na
phone=88456789
}这是我们用来将数据读入数组的代码。
{
local $/;
$data = <>;
}
@array = split /(?<=^})\n/m, $data;这一次,我们将$/设置为undef,这意味着已经从文件中读取了所有数据。然后,我们在找到换行符的地方拆分数据,该换行符前面有一个单独的}。
无论我们使用上述两种解决方案中的哪一种,我们最终都会得到一个数组,该数组(对于我们的样本数据)有三个元素-数据文件中的每个记录一个元素。然后就可以很容易地使用Perl grep以各种方式过滤该数组:
# All students whose names start with 'Ak'
@filtered_array = grep { /student=Ak/ } @array;如果您在原始数据文件上使用类似的技术,那么您可以使用如下代码获得您感兴趣的记录:
@filtered_array = grep { /TESTBED = vApp_eprapot_icr/ } @array;https://stackoverflow.com/questions/40546728
复制相似问题