【问题标题】:Extract Text from Array - perl从数组中提取文本 - perl
【发布时间】:2012-04-10 19:10:22
【问题描述】:

我正在尝试从 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 的新手,但正在尝试。谢谢

【问题讨论】:

  • 查找“正则表达式”。

标签: arrays perl text extract


【解决方案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})(.*)/;

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

【讨论】:

  • 不做不必要的工作(方法一):my $gig = unpack 'x17 a9';
  • 不做不必要的工作(方法二):my ($gig) = /^\S+\s+(\S+\s+\S+)/s;
  • 我无法相信回复如此快速和准确!这是我第一次访问这个网站。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我会读,我有点菜鸟,现在每个人都在告诉我使用 Python,这让我更加困惑。
  • 哦,Python 不错。 Perl 也不错。每种语言都有自己的优点。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多