小编Axe*_*man的帖子

编译正则表达式时可以捕获“无法识别的转义”警告吗?

我正在从配置文件中读取正则表达式,其中可能包含或不包含无效语法。(它被锁定在防火墙后面,所以我们不要讨论安全性。)我已经能够测试一些错误并给出友好的消息。

但在这方面却没有这样的运气:

Unrecognized escape \Q passed through in regex

我知道是什么原因导致的,我只是想知道是否可以在 Perl 5.8 中捕获它。到目前为止,它一直抵制我检查这种情况的努力。

所以问题是:有人知道如何捕捉这个吗?我必须重定向 STDERR 吗?

regex perl

4
推荐指数
1
解决办法
1349
查看次数

如何在Perl中创建哈希数组并在其中循环?

我正在尝试创建一个哈希数组,但是我在循环数组时遇到了麻烦.我试过这段代码,但它不起作用:

for  ($i = 0; $i<@pattern; $i++){
  while(($k, $v)= each $pattern[$i]){
    debug(" $k: $v");
  }
}
Run Code Online (Sandbox Code Playgroud)

arrays perl hash perl-data-structures

4
推荐指数
2
解决办法
1万
查看次数

如何在没有eval的情况下本地化一些传统的全局变量?

我问这个问题是因为我终于解决了一个问题,我一直试图在很多情况下找到一种技术.我觉得它非常整洁所以我正在做这个Q-and-A.

看,如果我可以使用eval,我会这样做:

eval join( "\n"
         , map { 
             my $v = $valcashe{$_}; 
             sprintf( '$Text::Wrap::%s = %s', $_
                    , ( looks_like_number( $v ) ? $v : "'$v'" )
                    )
          }
        );
Text::Wrap::wrap( '', '', $text );
Run Code Online (Sandbox Code Playgroud)

我甚至尝试过很棘手,但似乎local将符号本地化为虚拟块,而不是物理块.所以这不起作用:

ATTR_NAME: while ( @attr_names ) {
    no strict 'refs';
    my $attr_name       = shift;
    my $attr_name       = shift @attr_names;
    my $attr_value      = $wrapped_attributes{$attr_name};
    my $symb_path       = "Text\::Wrap\::$attr_name";
    local ${$symb_path} = $attr_value;
    next ATTR_NAME if @attr_names;

    Text::Wrap::wrap( '', '', $text …
Run Code Online (Sandbox Code Playgroud)

perl scope global-variables

4
推荐指数
1
解决办法
167
查看次数

如何从哈希哈希中获取哈希切片?

我有这样的哈希:

my %h = ( a => { one => 1,
                 two => 2
             },
          b => { three => 3,
                 four => 4
             },
          c => { five => 5,
                 six => 6
             }
      );

print join(',', @{$h{a}{qw/one two/}});
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:不能使用未定义的值作为q.pl第17行的ARRAY引用,这是打印行.

我的预期是1,2

perl hash slice perl-data-structures

4
推荐指数
1
解决办法
2317
查看次数

如何从哈希元素的引用中获取键

假设$my_ref = \$hash{'mary'}; #my_ref是哈希元素的参考点.
....
稍后,我如何使用它$my_ref来检索它指向的哈希元素的键?即如何从中获取字符串'mary' $my_ref

我问这个问题是因为我有几组用户名列表,一些用户名出现在多个消耗内存的组中.所以我决定创建一个通用的用户名列表,让这些组只存储对相应用户名的引用而不是用户名.

最初,

%group1 = {'mary'=>1, 'luke'=1,'tom'=1,...}  
%group2 = {'mary'=>1, 'sam'=1,'tom'=1,...}
Run Code Online (Sandbox Code Playgroud)

在这里你看到'mary'和'tom'都显示在两者中group1group2消耗内存.(注意我不关心这个例子中的值,这里的值只是因为数据结构是一个哈希值).所以为了减少内存,我希望有一个公共列表存储所有用户名:

%common_hash = {'mary'=>1, 'luke'=1,'tom'=1,'sam'=1...};  
$ref1 = \$common_hash{'mary'};  
$ref2 = \$common_hash{'luke'};  
$ref3 = \$common_hash{'tom'};  
$ref4 = \$common_hash{'sam'};
Run Code Online (Sandbox Code Playgroud)

组仅存储哈希元素的引用:

%group1 = {$ref1=>1, $ref2=1,$ref3=1,...};  
%group2 = {$ref1=>1, $ref4=1,$ref3=1,...}; 
Run Code Online (Sandbox Code Playgroud)

我认为这种方法可以节省大量内存,因为:

  1. 一个用户名一次不存储多次;
  2. groups存储引用(整数)而不是字符串(在我的例子中,每个用户名的长度平均为30个字节,而每个整数只有4个字节(32位sys.)或8个字节(64位sys.)) (顺便说一句,如果一个整数不使用4个字节或8个字节,请纠正我.)
  3. 使用引用我可以立即访问用户名而无需查找.

但是如何从组中获取用户名?

如果我使用@my_ref = keys %group1,我想我会得到'玛丽'的价值,但不是'玛丽'.

$result = $($my_ref[0]);
Run Code Online (Sandbox Code Playgroud)

perl reference hashref

4
推荐指数
1
解决办法
5724
查看次数

如何从Perl中的哈希数组创建哈希哈希?

我有一组哈希,都有相同的键组,例如:

my $aoa= [
 {NAME=>'Dave', AGE=>12, SEX=>'M', ID=>123456, NATIONALITY=>'Swedish'},
 {NAME=>'Susan', AGE=>36, SEX=>'F', ID=>543210, NATIONALITY=>'Swedish'},
 {NAME=>'Bart', AGE=>120, SEX=>'M', ID=>987654, NATIONALITY=>'British'},
]
Run Code Online (Sandbox Code Playgroud)

我想编写一个子程序,它将使用给定的键层次结构将其转换为哈希哈希值:

my $key_hierarchy_a = ['SEX', 'NATIONALITY'];
aoh_to_hoh ($aoa, $key_hierarchy_a) = @_;
 ...
}
Run Code Online (Sandbox Code Playgroud)

将返回

{M=>
  {Swedish=>{{NAME=>'Dave', AGE=>12, ID=>123456}},
   British=>{{NAME=>'Bart', AGE=>120, ID=>987654}}}, 
 F=>
  {Swedish=>{{NAME=>'Susan', AGE=>36,  ID=>543210}}
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不仅会创建正确的密钥层次结构,还会删除现在的冗余密钥.

我陷入困境,需要在正确的分层位置创建新的,最内部的哈希.

问题是我不知道"深度"(即键的数量).如果我有一个常数,我可以这样做:

%h{$inner_hash{$PRIMARY_KEY}}{$inner_hash{$SECONDARY_KEY}}{...} = filter_copy($inner_hash,[$PRIMARY_KEY,$SECONDARY_KEY])
Run Code Online (Sandbox Code Playgroud)

所以也许我可以编写一个循环,一次添加一个级别,从散列中删除该键,而不是将剩余的散列添加到"当前"位置,但它有点麻烦,我也不知道如何保持哈希散列中的"位置"......

perl hash perl-data-structures

4
推荐指数
1
解决办法
477
查看次数

如何在perl中使用列表哈希

对不起这个语法问题.我找不到解决办法.我想在perl中有一个哈希数组,每个哈希都有字符串和数组.我正在尝试编写以下代码:

use strict;
my @arr = (
       { name => "aaa" , values => ("a1","a2") },
       { name => "bbb" , values => ("b1","b2","b3") }
      );


foreach $a (@arr) {
  my @cur_values = @{$a->{values}};
  print("values of $a->{name} = @cur_values\n");
};
Run Code Online (Sandbox Code Playgroud)

但这对我不起作用.我收到编译错误和警告(使用perl -w)

a.pl第2行的匿名哈希中奇数个元素.在a.pl第9行使用"strict refs"时,不能使用字符串("a1")作为ARRAY引用.

perl perl-data-structures

4
推荐指数
2
解决办法
490
查看次数

算法效率改进

首先,如果有人提出这个问题,我想道歉.很难找到答案,无法找到如何创建数组哈希和哈希的数组....

我正在创建一个日志分析器.每个错误条目都在表单中

timestamp # # human_timestamp errno #
Run Code Online (Sandbox Code Playgroud)

我使用映射函数创建了散列哈希,以执行以下操作:

$logRef->{++$errCnt} =
{
    line       => $lineNum,
    timestamp  => $timestamp,
    humanStamp => $humanStamp,
    errno      => $errno,
    text       => ''
};
Run Code Online (Sandbox Code Playgroud)

稍后我会做一些分析,我想在行号之间隔离条目.分析条目也存储在哈希中......

$analysis{++$iteration} =
{
    result    => $result,
    startLine => $startLine,
    endLine   => $endLine,
    errors    => undef
};
Run Code Online (Sandbox Code Playgroud)

$ analysis {errors}将是一个数组引用.通过执行以下操作填充它.

foreach my $iteration ( keys %analysis )
{
    my @errKeys = grep { $logRef->{$_}{line} >= $analysis{$iteration}{startLine} &&
                         $logRef->{$_}{line} <= $analysis{$iteration}{endLine} }
                  keys %$logRef;

    my @errs = ();
    push @errs, $logRef->{$_}{errno} foreach ( …
Run Code Online (Sandbox Code Playgroud)

perl perl-data-structures

4
推荐指数
1
解决办法
114
查看次数

如何遍历对Perl中哈希数组的引用?

我引用了一个hases数组,我将其传递给perl脚本中的子例程

这是代码:

sub mySub {
    (my $resultref) = @_;
    my @list = @$resultref;
    print Dumper(@list);
    foreach my $result (@list) {
        print Dumper($result);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

$VAR1 = [
          {
            'portName' => '1.1',
            'ips' => [
                       '192.168.1.242'
                     ],
            'switchIp' => '192.168.1.20',
            'macs' => [
                        '00:16:76:9e:63:47'
                      ]
          },
          {
            'portName' => '1.10',
            'ips' => [
                       '192.168.1.119',
                       '192.168.1.3'
                     ],
            'switchIp' => '192.168.1.20',
            'macs' => [
                        'd0:67:e5:f8:7e:7e',
                        'd0:67:e5:f8:7e:76'
                      ]
          },
        ];

$VAR1 = [
          {
            'portName' => '1.1',
            'ips' => [
                       '192.168.1.242'
                     ],
            'switchIp' …
Run Code Online (Sandbox Code Playgroud)

arrays perl hash perl-data-structures

4
推荐指数
1
解决办法
2516
查看次数

Perl:如何将数组转换为嵌套的哈希键

我需要将一个平面的密钥列表转换为嵌套的哈希,如下所示:

我的$ hash = {};

我的@array = qw(key1 key2 lastKey Value);

ToNestedHash($ hash,@ array);

会这样做:

$ hash {'key1'} {'key2'} {'lastKey'} ="价值";

perl perl-data-structures

4
推荐指数
1
解决办法
1943
查看次数