是否可以对 n 维PDL
变量执行正则表达式?
例如,我可以通过执行将 100 添加到所有元素
$a1 = pdl [1,2];
print $a1 + 100;
但是,如果我的数组是一堆我想执行一些任务的字符串怎么办。例如,这失败了:
$a = pdl ['suze','david'];
$a =~ s/suze/female/;
print $a;
不确定这是否可能,但在此先感谢。
关键是,这PDL
是一个专为科学和批量数字数据处理和显示而设计的 perl 扩展。所以它真的不是为字符串操作而设计的。当您尝试遍历 piddle 时:
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的字符串版本还允许您使用字符串bad、inf和nan,它会插入您想要的值(如果您使用 bad,则设置 bad 标志)。您可以混合和匹配大小写,尽管您不应该这样做。
回到您的主要问题,为什么要使用PDL
字符串?- 为什么不使用简单的数组?
use strict;
use warnings;
use Data::Dumper;
my $a = ['suze','david'];
s/suze/female/ for @{$a};
print Dumper $a;
输出:
$VAR1 = [
'female',
'david'
];
作为 Paulchenkiller 回答的后续行动,PDL 通过PDL::Char对字符串提供了基本支持。但是,PDL::Char 数组中的每个字符串必须具有相同的长度,或者填充为空。您的示例将第一个条目的长度更改为比您之前分配的更长。这是您不能对 PDL::Char 应用正则表达式的原因之一。
此外,Perl 的字符串几乎没有多余的内存,并且当您将正则表达式应用于数组的每个成员时,循环遍历数组中的元素应该不会太昂贵。