4

是否可以对 n 维PDL变量执行正则表达式?

例如,我可以通过执行将 100 添加到所有元素

$a1 = pdl [1,2]; 
print $a1 + 100;

但是,如果我的数组是一堆我想执行一些任务的字符串怎么办。例如,这失败了:

$a = pdl ['suze','david'];
$a =~ s/suze/female/;
print $a;

不确定这是否可能,但在此先感谢。

4

2 回答 2

3

关键是,这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的字符串版本还允许您使用字符串badinfnan,它会插入您想要的值(如果您使用 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'
        ];
于 2014-06-10T19:21:46.673 回答
1

作为 Paulchenkiller 回答的后续行动,PDL 通过PDL::Char对字符串提供了基本支持。但是,PDL::Char 数组中的每个字符串必须具有相同的长度,或者填充为空。您的示例将第一个条目的长度更改为比您之前分配的更长。这是您不能对 PDL::Char 应用正则表达式的原因之一。

此外,Perl 的字符串几乎没有多余的内存,并且当您将正则表达式应用于数组的每个成员时,循环遍历数组中的元素应该不会太昂贵。

于 2014-06-10T21:51:07.427 回答