是否可以在n维PDL
变量上执行正则表达式?
例如,我可以通过
为所有元素添加100$a1 = pdl [1,2];
print $a1 + 100;
但是,如果我的数组是一堆字符串,我想执行一些任务。例如,这失败了:
$a = pdl ['suze','david'];
$a =~ s/suze/female/;
print $a;
不确定这是否可行,但提前谢谢。
答案 0 :(得分:3)
关键是,PDL
是一个perl扩展,专为科学和批量数字数据处理和显示而设计。所以它真的没有用于String操作。当你试图迭代一个小提琴时:
use strict;
use warnings;
use PDL;
my $a = pdl ['suze','david'];
print $_ . "\n" foreach ($a->list);
你会得到:
Argument "suze" isn't numeric in subroutine entry at Basic/Core/Core.pm.PL (i.e. PDL::Core.pm) line 1296, <DATA> line 207.
0
0
Argument "david" isn't numeric in subroutine entry at Basic/Core/Core.pm.PL (i.e. PDL::Core.pm) line 1296, <DATA> line 207.
当您深入了解POD时,您会发现:
$a = pdl(SCALAR|ARRAY REFERENCE|ARRAY|STRING);
对于STRING
pdl的字符串版本还允许您使用字符串错误, inf 和 nan ,它会插入你所指的值(并设置坏标志,如果你使用坏)。你可以混合和匹配案例,但你不应该。
回到主要问题,为什么要使用PDL
作为字符串? - 为什么不使用简单的数组?
use strict;
use warnings;
use Data::Dumper;
my $a = ['suze','david'];
s/suze/female/ for @{$a};
print Dumper $a;
输出:
$VAR1 = [
'female',
'david'
];
答案 1 :(得分:1)
作为Paulchenkiller答案的后续行动,PDL通过PDL::Char对字符串进行了初步支持。但是,PDL :: Char数组中的每个字符串必须具有相同的长度,或者为空填充。您的示例将第一个条目的长度更改为比以前分配的更长的时间。这是您无法对PDL :: Char应用正则表达式的一个原因。
此外,Perl的字符串几乎没有多余的内存,并且当你将一个正则表达式应用于数组的每个成员时,循环遍历数组中的元素不应该太昂贵。