在PERL PDL变量上执行正则表达式

时间:2014-06-10 03:20:26

标签: perl pdl

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

例如,我可以通过

为所有元素添加100
$a1 = pdl [1,2]; 
print $a1 + 100;

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

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

不确定这是否可行,但提前谢谢。

2 个答案:

答案 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的字符串几乎没有多余的内存,并且当你将一个正则表达式应用于数组的每个成员时,循环遍历数组中的元素不应该太昂贵。