我正在从配置文件中读取正则表达式,其中可能包含或不包含无效语法。(它被锁定在防火墙后面,所以我们不要讨论安全性。)我已经能够测试一些错误并给出友好的消息。
但在这方面却没有这样的运气:
Unrecognized escape \Q passed through in regex
我知道是什么原因导致的,我只是想知道是否可以在 Perl 5.8 中捕获它。到目前为止,它一直抵制我检查这种情况的努力。
所以问题是:有人知道如何捕捉这个吗?我必须重定向 STDERR 吗?
我正在尝试创建一个哈希数组,但是我在循环数组时遇到了麻烦.我试过这段代码,但它不起作用:
for ($i = 0; $i<@pattern; $i++){
while(($k, $v)= each $pattern[$i]){
debug(" $k: $v");
}
}
Run Code Online (Sandbox Code Playgroud) 我问这个问题是因为我终于解决了一个问题,我一直试图在很多情况下找到一种技术.我觉得它非常整洁所以我正在做这个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) 我有这样的哈希:
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
假设$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'都显示在两者中group1并group2消耗内存.(注意我不关心这个例子中的值,这里的值只是因为数据结构是一个哈希值).所以为了减少内存,我希望有一个公共列表存储所有用户名:
%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)
我认为这种方法可以节省大量内存,因为:
但是如何从组中获取用户名?
如果我使用@my_ref = keys %group1,我想我会得到'玛丽'的价值,但不是'玛丽'.
$result = $($my_ref[0]);
Run Code Online (Sandbox Code Playgroud) 我有一组哈希,都有相同的键组,例如:
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中有一个哈希数组,每个哈希都有字符串和数组.我正在尝试编写以下代码:
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引用.
首先,如果有人提出这个问题,我想道歉.很难找到答案,无法找到如何创建数组哈希和哈希的数组....
我正在创建一个日志分析器.每个错误条目都在表单中
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) 我引用了一个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) 我需要将一个平面的密钥列表转换为嵌套的哈希,如下所示:
我的$ hash = {};
我的@array = qw(key1 key2 lastKey Value);
ToNestedHash($ hash,@ array);
会这样做:
$ hash {'key1'} {'key2'} {'lastKey'} ="价值";