1

OID を解析して #18 を抽出しようとしていますが、ドットを区切り文字として使用して右から左にカウントするように記述する方法がわかりません。

1.3.6.1.2.1.31.1.1.1.18.10035

この正規表現は最後の値を取得します

my $ifindex = ($_=~ /^.*[.]([^.]*)$/);

必要な値を取得するために微調整する方法はまだ見つかりません。

4

4 に答える 4

5

どうですか:

my $str = "1.3.6.1.2.1.31.1.1.1.18.10035";
say ((split(/\./, $str))[-2]);

出力:

18
于 2013-01-16T13:36:47.943 に答える
3

形式が常に同じである場合(つまり、常に右から2番目)、次のいずれかを使用できます。-

m/(\d+)\.\d+$/;

..そして答えは次のようになります:$1

または、別のアプローチは、文字列をドット上の配列に分割し、配列の最後から2番目の値を調べることです。

于 2013-01-16T13:38:25.053 に答える
1

必要なものはもっと簡単です:

my $ifindex;

if (/(\d+)\.\d+$/)
{
   $ifindex = $1;
}

いくつかのコメント:

  1. 文字列全体を一致させる必要はなく、必要な部分だけを一致させる必要があります。したがって、先頭にアンカーして^使用する必要はありません.*。最後にのみアンカーします。
  2. [.]文字グループのマッチングを目的とした文字クラスです。たとえば、[abc]a、b、または c のいずれかに一致します。単一の文字に一致する場合は避ける必要があります。代わりにその文字に一致するだけです。この場合、これは特殊文字であるため、エスケープする必要があります: \..
  3. あなたの例に基づいて、すべての用語は数字でなければならないと仮定しました。したがって、私\d+は用語に使用しました。
于 2013-01-16T13:35:45.833 に答える
0
my $ifindex = ($_=~ /^.*[.]([^.]*)[.][^.]*$/);
于 2013-01-16T13:36:09.987 に答える