Выполнить регулярное выражение для переменной PERL PDL
Можно ли выполнить регулярное выражение для n-измерения PDL
переменная?
Например, я могу добавить 100 ко всем элементам, выполнив
$a1 = pdl [1,2];
print $a1 + 100;
Однако, что, если бы мой массив был набором строк, над которыми я хотел бы выполнить некоторую задачу. Например, это не удается:
$a = pdl ['suze','david'];
$a =~ s/suze/female/;
print $a;
Не уверен, что это вообще возможно, но заранее спасибо.
2 ответа
Дело в том, что 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 почти не имеют посторонней памяти, и циклическая обработка элементов в массиве не должна быть слишком дорогой, когда вы применяете регулярное выражение к каждому члену массива.