【问题标题】:Perl to match specific words in arrayPerl 匹配数组中的特定单词
【发布时间】:2014-04-18 21:42:26
【问题描述】:

需要快速 perl 脚本的帮助。我在 Linux 机器上有很多配置,我正在使用 grep、egrep 等并将其存储在一个数组中。

打印数组@unix 给出以下结果:

abc-xyz-1a.conf-virtual Hey {
abc-xyz-1a.conf-virtual How {
abc-xyz-1a.conf-virtual where {
abc-xyz-1b.conf-virtual Hey {
abc-xyz-1b.conf-virtual How {
abc-xyz-1b.conf-virtual where {

现在,如果您查看此输出,我正在寻找一个正则表达式来给我 2 个可能的东西。

首先是设备名,这里我们可以看到有2个设备名

abc-xyz-1a  and abc-xyz-1b 

其次,虚拟“Hey”、“How”、“Where”等词后面有不同的名称。

我需要将这些值提取到无法执行的变量中。

仅供参考,当我打印 print unix[0] 时,它会给出第一行,即

abc-xyz-1a.conf-virtual Hey {

任何建议将不胜感激。

【问题讨论】:

  • 您是要匹配预设数组中的特定单词,还是匹配输入中某个位置出现的单词并将它们放入数组中?到目前为止,这两种解决方案似乎都是后者,但您的问题暗示了第一种情况。

标签: regex perl


【解决方案1】:

您可以使用哈希表来记录这些信息,如下所示:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %record;

while (<DATA>) {
    chomp;
    my ($key, undef, $val) = split /\.|\s+/;
    push @{$record{$key}}, $val;
}

print Dumper(\%record);

__DATA__
abc-xyz-1a.conf-virtual Hey {
abc-xyz-1a.conf-virtual How {
abc-xyz-1a.conf-virtual where {
abc-xyz-1b.conf-virtual Hey {
abc-xyz-1b.conf-virtual How {
abc-xyz-1b.conf-virtual where {

测试:

$ perl t02.pl 
$VAR1 = {
          'abc-xyz-1a' => [
                            'Hey',
                            'How',
                            'where'
                          ],
          'abc-xyz-1b' => [
                            'Hey',
                            'How',
                            'where'
                          ]
        };

【讨论】:

  • 使用perl函数grep
  • @ZhangChn 目的是什么?
  • @LeeDuhem ...我在打印值时遇到了一个问题,它打印了所有 3 个值“Hey, How Where”。读取第一个第二个和第三个元素的语法是什么???
  • @user3185596 $record{'abc-xyz-1a'}-&gt;[0] 或$record{'abc-xyz-1a'}[0] 会给你Hey,你可以通过类似的方式访问%record 中的其他数据。请阅读perlref了解更多详情。
  • @LeeDuhem..再次感谢
【解决方案2】:

这样的事情应该可以工作:

#!/usr/bin/perl
use strict;
use warnings;

while ( <DATA> ) {
   my ($device, $word) = /([a-z0-9-]+)\Q.conf-virtual\E\b(.+)\b/;
   print "Device: $device -- Word: $word\n";
}

__DATA__
abc-xyz-1a.conf-virtual Hey {
abc-xyz-1a.conf-virtual How {
abc-xyz-1a.conf-virtual where {
abc-xyz-1b.conf-virtual Hey {
abc-xyz-1b.conf-virtual How {
abc-xyz-1b.conf-virtual where {

正则表达式分解:

# capture 1, match one or more of a lowercase letter, number, or dash
([a-z0-9-]+)

# \Q disables meta characters
# match .conf-virtual literally
# \E enables meta characters again 
\Q.conf-virtual\E

# \b word boundary
# (.+) capture 2, match one or more of anything
# \b word boundary
\b(.+)\b

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2021-05-22
    • 2017-08-11
    相关资源
    最近更新 更多