2014-06-10 30 views
4

是否可以在n維PDL變量上執行正則表達式?在PERL PDL變量上執行正則表達式

例如,我可以通過做

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

然而,如果有什麼我的數組是一幫,我想在執行一些任務字符串添加100到所有元素。例如,這失敗:

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

不知道這是否甚至可能,但在此先感謝。

+0

我不認爲PDL有正則表達式。我認爲你將不得不將你的PDL數組轉換成perl數組,然後執行正則表達式 –

+0

爲什麼你要爲字符串使用'PDL'? - 它只是不是爲了這個:P –

回答

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,並,它會插入你的意思是值(並設置不良標識如果使用不好)。你可以混合和匹配大小寫,但不應該。

回到你的主要問題,你爲什麼用PDL作爲字符串? - 爲什麼不使用簡單的數組?

use strict; 
use warnings; 
use Data::Dumper; 

my $a = ['suze','david']; 
s/suze/female/ for @{$a}; 
print Dumper $a; 

輸出:

$VAR1 = [ 
      'female', 
      'david' 
     ]; 
1

作爲後續Paulchenkiller的回答,PDL具有通過PDL::Char串的基本支持。但是,PDL :: Char數組中的每個字符串必須具有相同的長度,或者填充爲空。您的示例將第一個條目的長度更改爲比您之前分配的時間更長的時間。這是你不能對PDL :: Char應用正則表達式的原因之一。

此外,Perl的字符串幾乎不存在無關的內存,並且在對數組中的每個成員應用正則表達式時,循環遍歷數組中的元素不應該太昂貴。

+0

很酷,甚至不知道這個附加存在:D –