如何在数组中获取特定块将被复制到perl中

时间:2016-11-11 11:10:38

标签: arrays perl pattern-matching

我在数组中有如下的详细信息。在实际情况下会有大量的测试台细节。我想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的数据。从开幕式开始' {'关闭'}'所有信息都应该复制到另一个数组。这就是我正在寻找的。

2 个答案:

答案 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;