Похоже на эту строку:
system(" NPBSS_CLR('$short_name', '-n 1') ")
в итоге вызовет что-то вроде этой команды оболочки:
NPBSS_CLR('TTCCACTGCGGAGCACCAGT_91.fsa', '-n 1')
Здесь есть две проблемы:
- NPBSS_CLR - это функция Matlab, а не видимая ОС команда, которую можно вызвать из оболочки
- Скобки (
(...)
) имеют особое значение для оболочки
КомуЗапустите функцию Matlab из Perl system(...)
, вам нужно, чтобы он запустил Matlab, чтобы запустить эту функцию с помощью опции matlab
-r
.Примерно так:
system("/Applications/MATLAB_R2018a.app/bin/matlab -nodesktop -nosplash -r \"NPBSS_CLR('$short_name', '-n 1'); exit\"");
Вызов .../matlab
заставит вас запустить Matlab, а экранированные кавычки (\"...\"
) будут "защищать" скобки.
Но если бы я былВы, я бы упростил эту настройку, полностью удалив скрипт Perl и переписав его как скрипт M-кода Matlab, который мог бы напрямую вызывать функцию NPBSS_CLR
.Таким образом, вам не нужно беспокоиться о цитировании своих значений, чтобы пройти через Perl и оболочку, избежать накладных расходов на запуск нескольких сеансов Matlab и работать со всем в отладчике одного сеанса Matlab.Примерно так:
%Automate_NPBSS.m
function Automate_NPBSS
cd('/Users/user/Desktop/NPBSS_MATLAB-master/');
d = dir('*.fsa');
for i = 1:numel(d)
file = d(i);
if isempty(regexp(file.name, '[TAGC]{20}_\d+\.fsa'))
continue
end
NPBSS_CLR(file.name, '-n 1');
end
end
(Единственное предостережение в том, что вы не сможете легко распараллелить это без набора инструментов Matlab Parallel Computing, поэтому, если вы хотите это сделать, вам нужно придерживатьсяsystem()
в Perl или Matlab.