![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
Я начал изучать Перл, и столкнулся с такой диллемой.
ОС у меня Win32, а большинство материала для Перла предназначенна для Nix'ов. Так вот никака не могу заставить это работать #!usr/bin/perl -w Win32::Process::Create($Process, "c:\\WINDOWS\\system32\\notepad.exe", "notepad", 0, DETACHED_PROCESS, ".") || die "Create: $!"; Есть какие идеи? |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Вот накатал такой пример. Запусти его и если возникнет ошибка, то получишь вразумительное сообщение системы, т.е. увидешь почему он не работает.
У меня работает. Зы: Если используешь такие модули, то делай это по максимуму, т.е. выжимай из него всё что можешь. Это я о подпрорграмме ErrorMess, потому как содержимое пременной $! ничего тебе не скажет, если ты работаешь с модулем Win32::Process. Удачи. Это сообщение отредактировал(а) korob2001 - 27.5.2005, 03:11 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
Спасибо
Правда та часть подпрограммы, которая по идеи должна убить процесс while ( 1 ) { print "Your want kill this process (y/n): "; chomp( my $res = <STDIN> ); if ( $res =~ /^y(?:es)?$/i ) { my $exit; $Process->GetExitCode( $exit ); $Process->Kill( $exit ); last } elsif ( $res =~ /^no?$/i ) { sleep 10; next; не работает. Он выводит PRINT но на это -> if ( $res =~ /^y(?:es)?$/i ) { my $exit; $Process->GetExitCode( $exit ); $Process->Kill( $exit ); не реагирует. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
А что за ось??? У меня WinXP Pro и всё чудно работает. Попробуй в начале ещё указать такую строку:
Это сообщение отредактировал(а) korob2001 - 28.5.2005, 00:59 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
Да, теперь заработало. Ось такая же как и у тебя. А можно ещё вопрос, почему "system" не получается пользоваться?
|
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Покажи как ты ей пользуешься, я же не телепат.
Ладно, попробую немного побыть телепатом. Не работает у тебя, скорее всего потому, что ты пытаешься сохранить результаты выполнения system() в переменную, для дальнейшей обработки. Когда ты хочешь обработать результаты выполнения системной команды, юзай обратные кавычки, примерно так:
Удачи. ЗЫ: При вставке кода в сообщение, пользуйся кнопкой "КОД" Это сообщение отредактировал(а) korob2001 - 28.5.2005, 01:03 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
ну вообщето Я пытался использовать System так
Код Perl system("с:\\windows\\system32\notepad.exe >right_now") && die "cannot create right_now"; но такая конструкция у *никсов,как Я понял. Добавлено @ 17:06 блин "Код" Perl system("с:\\windows\\system32\notepad.exe >right_now") && die "cannot create right_now"; Добавлено @ 17:06 |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Найди ошибку:
Подсказка: \n - это перевод строки. Может потому и не работает?? -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
"Код" #!usr/bin/perl -w system("c:\\WINDOWS\\system32\\notepad.exe >right_now"); --> работает Хотя по сути такойже "Код" #!usr/bin/perl -w system("C:\\Program Files\\Winamp\\winamp.exe >right_now"); не работает Добавлено @ 20:24 Кстати извини только сейчас заметил "код", думал его как HTMLевский тэг надо использовать |
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
А почему как думаешь??? Попробуй так:
Ну думаю тут пояснений не нужно, но если возникнут вопросы, пиши. Удачи. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
Одну ощибку увидел и понял. Это ковычки,Перл рассматривает путь до exe вплоть до закрытия ковычек.
>right_now" было глупо Но функцию q так и не понял,а без неё не работает. Единственную функцию q, что я нащёл это что все последние метасимволы становятся обычными символами, но это работа с текстом, что сюда непременительно. Есть ещё лдин вопрос, если при помощи system так легко создать процесс зачем тогда использовать громоздкое
use Win32::Process; my $Process; |
|||
|
||||
| korob2001 |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Можно присвоить переменной строку так:
Все эти присвоения абсолютно эквивалентны, присвоению переменной строки в одинарных кавычках. Т.е. твою строку можно было бы записать так:
И она будет работать точно так же. Тоже самое можно вытворять и с двойными кавычками, только нужно добавить ещё одну q, т.е:
Это очень удобно, когда в строке в двойных кавычках, нужно вставить двойные кавычки, вот пример:
Заметь, вариант с qq|| намного убнее для чтения программы, в нём нам не пришлось перекрывать кавычки обратным слешем. Думаю этот вопрос мы достаточно разобрали.
Потому что system() просто передаёт на выполнение комаду оболочке, т.е. просходит примерно следующее: Когда Perl встречает system("команда"), сначала он интерполирует все переменные, если они там есть, затем он передаёт команду оболочке. Запускается внешний процеесс cmd.exe, именно он выполняет твою команду ( а на запуск внешнего процесса уходит не мало времени ), Perl.exe в это время ожидает ответа, т.е. пока cmd.exe выполняет полученную команду, Perl.exe просто бездействует, что не есть гуд. Когда он получает ответ, то тут же выводит его в STDOUT и продолжает выполнение программы. Вобщем работать с модулем намного удобнее, безопаснее и программа будет выполняться быстрее, так как ей не нужно будет ждать ответа оболочки и запускать лишний процесс. Конечно если тебе нужно просто запустить notepad.exe, то наверное гораздо разумнее заюзать system(), если же тебе нужно ещё и управлять процессами, то лучше заюзать модуль. PS: Когда жмёшь на кнопку код, появляются такие тэги:
Удачи. Это сообщение отредактировал(а) korob2001 - 1.6.2005, 18:36 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||||||
|
|||||||||||||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
Спасибо
Будут ещё вопросы уже задам в новом тоике |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Пропустил это.
Нет. Perl рассматривает эту строку так, как нужно, а вот cmd.exe предполагает, что ты пытаешься запустить файл: C:\\Program, а остальную часть: Files\\Winamp\\winamp.exe, >right_now он рассматривает как параметры. Это всё из-за пробела в пути в имени каталога /Program Files. Другими словами, запуск программы из MS-DOS выглядит примерно так: C:\>исполняемый_файл /ключь параметр1 параметр2 параметр3 Отсюда видно что всё разделено пробелом. Если же нужно указать путь где есть пробел, то в MS-DOS это делается следующим образом: D:\>"C:\Program Files\Winamp\winamp.exe" /ключь параметр1 параметр2 Вот мы и захватили в каввычки путь к файлу, так как в нём есть пробелы. Т.е. когда ты вызываешь system("команда") или `команда`, ты должен использовать синтаксис не Perl, а MS-DOS, потому как и именно он будет работать с твоей командой. Удачи. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Rustty |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.5.2005 Репутация: нет Всего: нет |
Аха,спасибочки.
Ну тогда ещё вопрос. Перл может передовать файлы через Интернет(tcp/ip), мэйл? Codding не нужен, если да тогда сам его надумаю. |
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |