我在数组中有如下的详细信息。在实际情况下会有大量的测试台细节。我想grep一个特定的测试平台(TESTBED = vApp_eprapot_icr),下面的信息应该被复制到另一个数组。我怎么能用perl做呢?通过关闭花括号可以理解Testbed信息的结束。
@echo off & setlocal EnableDelayedExpansion
ECHO %netUse%
IF NOT "%netUse%" == "" (
IF !netUse! EQU 1 (
IF !netUsePW! EQU 1 (
NET USE %netUseLetter% %netPath% %pw% /user:!netUser!
)
IF !netUsePW! EQU 0 (
NET USE %netUseLetter% %netPath%
)
)
)
我会更简单,请看下面的数组
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
}
考虑这样的数组。这样的条目很多。我需要grep,例如student = Akshaya的数据。从开幕式开始' {'关闭'}'所有信息都应该复制到另一个数组。这就是我正在寻找的。 p>
答案 0 :(得分:0)
while (<>) {
print if /TESTBED = vApp_eprapot_icr/../\}/;
}
作为旁注<>
将捕获您在cmdline上使用的文件名。因此,如果数据存储在文件中,您将从命令行
perl scriptname.pl filename.txt
答案 1 :(得分:0)
确定。我们终于有足够的信息来提出答案。或者,至少,产生两个答案,这些答案将适用于输入文件的略有不同的版本。
在评论中,您说您正在创建这样的数组:
@array = `cat $file`;
由于几个原因,这不是一个好主意。首先,当Perl为您读取文件时,为什么要运行像cat
这样的外部命令。其次,这为您的数组中的输入文件中的每一行提供了一个元素。如果您安排它,以便每个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进入&#34;段落#34;模式,它使用空行来分隔记录。所以我们可以编写这样的代码:
{
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;