首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在perl中复制数组中的特定块

如何在perl中复制数组中的特定块
EN

Stack Overflow用户
提问于 2016-11-11 19:10:38
回答 2查看 74关注 0票数 0

我在数组中有类似下面的细节。在实际案例中将会有大量的测试细节。我想grep一个特定的testbed(TESTBED = vApp_eprapot_icr),如下所示的信息应该被复制到另一个数组中。我如何使用perl来完成这项工作?测试床末尾的信息可以通过闭合的花括号来理解。

代码语言:javascript
复制
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

}

我会让它更简单,请看下面的数组

代码语言:javascript
复制
@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的数据为例。从开始的'{‘到结束的'}’,所有信息都应该复制到另一个数组中。这就是我要找的。

EN

回答 2

Stack Overflow用户

发布于 2016-11-11 21:27:57

代码语言:javascript
复制
while (<>) {
  print if /TESTBED = vApp_eprapot_icr/../\}/;
}

作为附注,<>将捕获您在cmdline上使用的文件名。因此,如果数据存储在一个文件中,您将从命令行运行

代码语言:javascript
复制
perl scriptname.pl filename.txt
票数 0
EN

Stack Overflow用户

发布于 2016-11-12 16:26:16

好的。我们终于有了足够的信息来给出答案。或者,至少产生两个答案,这两个答案将在您的输入文件的稍微不同的版本上工作。

在评论中,您说您正在创建数组,如下所示:

代码语言:javascript
复制
@array = `cat $file`;

由于几个原因,这不是一个很好的主意。首先,当cat将为您读取文件时,为什么还要运行像Perl这样的外部命令。其次,这为输入文件中的每一行提供了数组中的一个元素。如果您将其安排为每个TESTBED = foo { ... }记录都是一个数组元素,事情就会变得简单得多。

让我们先去掉cat。将单个文件读入数组的最简单方法是使用文件输入运算符- <>。它将从命令行上给定名称的文件中读取数据。所以如果你把你的程序叫做filter_records,你可以这样叫它:

代码语言:javascript
复制
$ ./filter_records your_input_data.txt

然后读入一个数组,如下所示:

代码语言:javascript
复制
@array = <>;

这很好,但是我们仍然将输入文件的每一行都放在它自己的数组元素中。我们如何解决这个问题取决于输入文件的确切格式。最简单的方法是在输入文件中的每条记录之间有一个空行,如下所示:

代码语言:javascript
复制
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将进入“段落”模式,并使用空行来分隔记录。所以我们可以像这样写代码:

代码语言:javascript
复制
{
  local $/ = '';
  @array = <>;
}

请注意,将对Perl的特殊变量的更改本地化总是一个好主意,这就是为什么我将整个过程包含在一个裸露的块中。

如果没有空行,事情就会变得稍微困难一些。我们将读取整个文件,然后将其拆分。

下面是没有空行的示例文件:

代码语言:javascript
复制
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
}

这是我们用来将数据读入数组的代码。

代码语言:javascript
复制
{
  local $/;
  $data = <>;
}

@array = split /(?<=^})\n/m, $data;

这一次,我们将$/设置为undef,这意味着已经从文件中读取了所有数据。然后,我们在找到换行符的地方拆分数据,该换行符前面有一个单独的}

无论我们使用上述两种解决方案中的哪一种,我们最终都会得到一个数组,该数组(对于我们的样本数据)有三个元素-数据文件中的每个记录一个元素。然后就可以很容易地使用Perl grep以各种方式过滤该数组:

代码语言:javascript
复制
# All students whose names start with 'Ak'
@filtered_array = grep { /student=Ak/ } @array;

如果您在原始数据文件上使用类似的技术,那么您可以使用如下代码获得您感兴趣的记录:

代码语言:javascript
复制
@filtered_array = grep { /TESTBED = vApp_eprapot_icr/ } @array;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40546728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档