0

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

我想创建一个这样的数组:

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

4 回答 4

1

Perl 就是为此而生的。正则表达式是要走的路。阅读perldoc perlre

foreach $ints (@array) {
  $ints =~ s/(Gig.{6})/$1/g;
}
于 2012-04-10T19:15:04.407 回答
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})(.*)/;

但是,如果没有适当的文件规范,这在一般情况下是行不通的。

于 2012-04-10T19:23:13.043 回答
1

所以你想要第二个和第三个字段。

my @array = map { /^\S+\s+(\S+\s\S+)/s } @source;
于 2012-04-10T19:32:43.680 回答
0

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

my @results = map { m!(\bGig\s+\d+/d+)! } @array;
于 2012-04-10T20:48:40.263 回答