perl - 使用 Perl 从文本中提取多个项目

标签 perl

我需要从多行字符串中提取多个项目。

{
      'autoname' => 1,
      'class' => 'packetfilter',
      'data' => {
                  'action' => 'accept',
                  'auto' => 0,
                  'auto_type' => '',
                  'comment' => 'Allow access to Sandbox Server',
                  'destinations' => [
                                      'REF_NetworkAny'
                                    ],
                  'direction' => '',
                  'group' => 'SANDBOX',
                  'interface' => '',
                  'log' => 1,
                  'name' => 'TCP_5090 from SND (Network) to Any',
                  'services' => [
                                  'REF_SerTcpTcp5090',
                                  'REF_SerTcpTcp8200',
                                  'REF_SerTcpTcp8883',
                                  'REF_SerTcpTcpudp5090'
                                ],
                  'source_mac_addresses' => '',
                  'sources' => [
                                 'REF_MHTGIvpkvI'
                               ],
                  'status' => 1,
                  'time' => ''
                },
      'hidden' => 0,
      'lock' => '',
      'nodel' => '',
      'ref' => 'REF_PacPacTcp50FromSnd',
      'type' => 'packetfilter'
    }

我需要找到标签“服务”、目的地和来源,并只提取每个标签的 REF 标签。

例子:

services
REF_SerTcpTcp5090
REF_SerTcpTcp8200
REF_SerTcpTcp8883
REF_SerTcpTcpudp5090

destinations
REF_NetworkAny

sources
REF_MHTGIvpkvI

如有任何指导,我们将不胜感激。

最佳答案

这确实看起来像 Perl。您可以使用 eval 将其转换为 Perl 数据结构,但这有很多安全问题。

相反,使用 the Safe module评估它,但只允许某些运算符(operator)。这将阻止它做一些不安全的事情,比如打开文件或添加功能。这是一个演示。

use v5.10;
use strict;
use warnings;

use Safe;

my $safe = Safe->new;
my $data = $safe->reval(join "", <DATA>) or die "reval failed: $@";
say join "\n", keys %$data;

__END__
{
      'autoname' => 1,
      'class' => 'packetfilter',
      'data' => {
                  'action' => 'accept',
                  'auto' => 0,
                  'auto_type' => '',
                  'comment' => 'Allow access to Sandbox Server',
                  'destinations' => [
                                      'REF_NetworkAny'
                                    ],
                  'direction' => '',
                  'group' => 'SANDBOX',
                  'interface' => '',
                  'log' => 1,
                  'name' => 'TCP_5090 from SND (Network) to Any',
                  'services' => [
                                  'REF_SerTcpTcp5090',
                                  'REF_SerTcpTcp8200',
                                  'REF_SerTcpTcp8883',
                                  'REF_SerTcpTcpudp5090'
                                ],
                  'source_mac_addresses' => '',
                  'sources' => [
                                 'REF_MHTGIvpkvI'
                               ],
                  'status' => 1,
                  'time' => ''
                },
      'hidden' => 0,
      'lock' => '',
      'nodel' => '',
      'ref' => 'REF_PacPacTcp50FromSnd',
      'type' => 'packetfilter'
}

安全并非 100% 安全,因此您不应养成这种习惯。如果可能,请使用 JSON 等可解析格式进行数据序列化。

关于perl - 使用 Perl 从文本中提取多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462900/

相关文章:

perl - 将散列 (HoH) 的散列复制到键/值对中并返回到 perl

perl - 如何在 OU 中列出 OU?

perl - Perl 6 中的枚举或符号

perl - 在Perl中重定向输出时fork exec杀死的问题

xml - 在 XML 中编码和符号

arrays - 需要根据单独数组的排序对4个不同的数组进行排序

perl - 在 perl 中循环更新值

arrays - 如何在Perl中将数组传递给函数?

perl - 如何确定gettext的安装版本?

perl - Perl 中的随机/随机哈希键