从数组中提取文本 - perl

时间:2012-04-10 19:10:23

标签: arrays perl text extract

我正在尝试从SNMP查询创建的数组中提取接口。

我想创建一个类似THIS的数组:

my @array = ( "Gig 11/8",
              "Gig 10/1",
              "Gig 10/4",
              "Gig 10/2");

目前看起来像这样:

my @array = 
( "orem-g13ap-01    Gig 11/8          166            T       AIR-LAP11 Gig 0",
  "orem-g15ap-06    Gig 10/1          127            T       AIR-LAP11 Gig 0",
  "orem-g15ap-05    Gig 10/4          168            T       AIR-LAP11 Gig 0",
  "orem-g13ap-03    Gig 10/2          132            T       AIR-LAP11 Gig 0");>

我正在做这个:

foreach $ints (@array) {
         @gig = substr("$ints", 17, 9);
         print("Interface: @gig");

确实有效,但主机名[orem-g15ap-01]并不总是保持相同的长度,具体取决于网站。我需要提取单词“Gig”加上接下来的6个字符。我不知道这样做的最佳方式是什么。

我是perl的新手但是尝试了。感谢

4 个答案:

答案 0 :(得分:1)

像这样的东西就是Perl的制作方式。正则表达式是要走的路。阅读perldoc perlre

foreach $ints (@array) {
  $ints =~ s/(Gig.{6})/$1/g;
}

答案 1 :(得分:1)

# "I need to extract the word "Gig" plus the next 6 characters."
# This looks like a fixed-with file format, so consider using unpack.
foreach ( @lines ) {
    my( $orem, $gig, $rest ) = unpack 'a17 a9 a*';
    print "[$gig]\n";
}

如果它没有固定 - 格式化,那么你需要找出文件规范是什么,然后可能使用正则表达式,如:

    my( $orem, $gig, $rest ) = m/(\S+)\s+(.{9})(.*)/;

但如果没有适当的文件规范,这在一般情况下不起作用。

答案 2 :(得分:1)

所以你想要第二和第三个领域。

my @array = map { /^\S+\s+(\S+\s\S+)/s } @source;

答案 3 :(得分:0)

这个就像ikegami的,但我建议如果你知道你想要的东西看起来,那么一定要指明那个。因为这是在列表上下文中完成的,所以任何与规范不匹配的字符串都会返回一个空列表 - 或者被忽略。

my @results = map { m!(\bGig\s+\d+/d+)! } @array;