gpt4 book ai didi

regex - 基于正则表达式在perl中对foreach中的数组进行动态散列

转载 作者:行者123 更新时间:2023-12-04 04:47:23 24 4
gpt4 key购买 nike

所以我试图根据 foreach 中的正则表达式制作数组散列。

我得到了一些文件路径,它们的格式如下:

longfilepath/name.action.gz

所以基本上会有同名但 Action 不同的文件,所以我想用作为 Action 数组的名称键制作一个散列。我显然做错了什么,因为我在运行代码时不断收到此错误:
Not an ARRAY reference at ....the file I'm writing in

这是我没有得到的,因为我正在检查它是否已设置,如果没有将其声明为数组。我还在习惯 perl,所以我猜我的问题很简单。

我还应该说,我已经验证我的正则表达式正确生成了“名称”和“操作”字符串,因此问题肯定出在我的 foreach 中;

感谢您的帮助。 :)

我的代码是这样的。
my %my_hash;
my $file_paths = glom("/this/is/mypath/*.*\.gz");
foreach my $path (@$bdr_paths){

$path =~ m"\/([^\/\.]+)\.([^\.]+)\.gz";

print STDERR "=>".Dumper($1)."\n\r";
print STDERR "=>".Dumper($2)."\n\r";

#add the entity type to a hash with the recipe as the key
if($my_hash{$1})
{
push($my_hash{$1}, $2);
}
else
{
$my_hash{$1} = ($2);
}

}

最佳答案

它是 glob ,不是 glom .在 glob 表达式中,句点不是元字符。 → glob '/this/is/mypath/*.gz' .

使用备用正则表达式分隔符的全部原因是为了避免不必要的转义。正斜杠不是正则表达式元字符,而是一个分隔符。在字符类中,许多操作符失去了它们的特殊性;没有必要逃避这个时期。尔格 m!/([^/.]+)\.([^.]+)\.gz! .

不附加 \n\r到您的输出。 ① Dumper函数已经附加了一个换行符。 ② 如果您使用的是需要 CRLF 的操作系统,请使用 :crlf PerlIO 层,它转换所有 \n s 到 CRLF。您可以通过 binmode STDOUT, ':crlf' 添加图层. ③ 如果你正在做网络,最好指定你想要发出的确切字节,例如\x0A\x0D\012\015 . (但在这种情况下,还要删除所有 PerlIO 层)。

使用引用作为 push 的第一个参数不适用于 v5.14 之前的 perls。

不要手动检查您是否在哈希中填充了插槽;如果是 undef并用作arrayref,在那里自动创建一个数组引用。这被称为自动活化。当然,这需要您执行此取消引用(并跳过 push 的简短形式)。

在 Perl 中,括号只排序优先级,并在赋值的 LHS 上使用时创建列表上下文。它们不创建数组。要创建匿名数组引用,请使用方括号:[$var] .像你一样使用括号是没用的; $x = $y$y = ($y)是完全相同的。

所以你要么想要

push @{ $my_hash{$1} }, $2;

要么
if ($my_hash{$1}) {
push $my_hash{$1}, $2;
} else {
$my_hash{$1} = [$2];
}

编辑 : 我忽略了三件事。

glob在标量上下文中使用,它变成了一个迭代器。这通常是不需要的,除非在 while(my $path = glob(...)) { ... } 中使用。喜欢时尚。否则更难确保迭代器耗尽。相反,使用 glob在列表上下文中一次获取所有匹配项: my @paths = glob(...) .

在哪里 $bdr_paths来自?里面是什么?

始终检查正则表达式是否实际匹配。这可以避免细微的错误,因为捕获 $1等保持它们的值(value)直到下一次成功匹配。

关于regex - 基于正则表达式在perl中对foreach中的数组进行动态散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17979567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com