Небольшой вопрос о Perl
2484
6
Доброго времени суток всем!
Возникла небольшая проблема в приложении под windows. Привожу отдельно неработающий кусок:

use Tk;
$main = MainWindow -> new();
$main -> Button (-text => "ClustalW2", -command => \&Clust) -> pack();
MainLoop();

sub Clust()
{
system('cd путь_к_программе & cама_программа.exe');
}

Работает без проблем, если так:

Clust();

sub Clust()
{
system('cd путь_к_программе & cама_программа.exe');
}

В linux подобной проблемы не возникало и всё отлично работало :а\?:
Может кто подсказать, в чём проблема?
alcedonia
Подумайте еще раз, что происходит при вызове system.
Намекаю, загружается шелл пользователя, и ему передается строка команды для выполнения. Шелл cmd и bash/sh - разный шелл ))) Cmd может не понять конструкцию вида cd ../aa && ./aa.exe =)
Mad_Dollar
Дело в том, что конструкцию вида cd ../aa & ./aa.exe он как раз понимает и запускает, если её вызывает просто в программе.
А вот в виде
$main -> Button (-text => "ClustalW2", -command => \&Clust) -> pack();
не может запустить нужный а.exe (как понимаю, он его не находит)
даже если явно прописать
$main -> Button (-text => "ClustalW2", -command => sub{system('cd путь_к_программе & cама_программа.exe');}) -> pack();
Меняется только то, что я подключаю пользовательский интерфейс. :а\?:
Не понимаю, почему не работает... может, perl другой скачать? о.О
alcedonia
Кстати да - что у вас за перл под виндовс?
Кстати, вот это , в частности пример использования button читали?
Посмотрите, ваша процедура-обработчик вообще вызывается? Попробуйте оттуда не просто делать system, а писать что-нибудь до вызова system и после в файл. может быть у вас обработчик вообще не вызывается, кстати.
Mad_Dollar
Сейчас стоит ActivePerl-5.8.8.819. Скачивается ActivePerl-5.10.1.1006

Пробовала сделать так:
sub Clust(){
$status=system('cd C:\Program Files\ClustalW2 & clustalw2.exe');
print $status;
}
возвращает 256 и что "ClustalW2" не является программой, а если просто
sub Clust(){
$status=system('cd C:\Program Files\ClustalW2');
print $status;
}
возвращает 0

Что самое непонятное, при вызове не из button - всё работает так, как нужно и возвращает 0 в обоих случаях.

Извиняюсь, конечно, за этот бред... :смущ:ничего не понимаю) Сейчас ещё perl переставлю, может и заработает:улыб:
alcedonia
Спасибо, что откликнулись:улыб:Переустановила - всё заработало!
alcedonia
cd C:\Program Files\ClustalW2
имя каталога у вас с пробелами. Экранируйте его, чтоли...
и почему не использовать:
chdir ("C:\Program Files\ClustalW2");
system("./clustalw2.exe");
зачем для смены рабочего каталога использовать system?