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

したがって、2 番目と 3 番目のフィールドが必要です。

my @array = map { /^\S+\s+(\S+\s\S+)/s } @source;
于 2012-04-10T19:32:43.680 に答える
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 に答える
0

これは池上のようなものですが、見た目が分かっている場合は、ぜひそれを指定することをお勧めします。これはリスト コンテキストで行われるため、仕様に一致しない文字列は空のリストを返すか、無視されます。

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