![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Есть некая команда printzebra.pl
В процессе своего выполнения она запускает файл get.szmhdat с параметрами X Y Z. На основе этих X Y Z get.szmhdat делает SQL запрос в базу и вытаскивает некое A, которое передаётся в printzebra.pl для её дальнейшего выполнения. Вопрос: Как printzebra.pl может передать, а get.szmhdat - воспринять X, Y и Z, при условии, что в Y и Z возможны пробелы? Если пробелов нет - то всё понятно, но вот с пробелами... |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Что-то вообще ничего не понял. Если можно подробнее.
Я понял так: 1. Ты запускаешь программу printzebra.pl 2. Эта программа должна запусть на выполнение программу get.szmhdat и передать ей три параметра X, Y, Z ( А что за расширение такое у второго файла? ). 3. get.szmhdat должна на основе полученных параметров получить из базы данных, некое значение A и вернуть его программе printzebra.pl Я правильно понял условие? Если да, то о каких пробелах идёт речь? -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Ты всё понял правильно.
Точка в get.szmhdat стоит не ради обозначения расширения. Это не важно. Проблема в том, что я не знаю как передать эти параметры... Просто на шеле воспринятие параметров команды и перевод их в переменные выглядел бы примерно так: X=$1 Y=$2 Z=$3 Но если Y состоит из "двух слов", т.е. имеет в себе пробел, то вторая часть уже пойдёт как $3... |
|||
|
||||
| korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Можно через системный вызов. Допустим есть программа, которая принимает 3 числа, складывает их и выводит сумму в STDOUT. Я назвал её called.pl
Следующая программа вызывает пред идущую и передаёт ей 3 параметра, получает результат и ввыводит его в STDOUT.
Я привёл пример того, как вызвать через другую другую программу и передать ей параметры, для упрощения я передаю цифры, но как я понял ты должен передавать строки в которых может быть пробел. Коргда передаёшь строку в качестве параметра и в этой строке присутствует пробел, то просто захвати данный параметр в кавычки, т.е.
Только не забудь при передаче параметров, прогнать всё это через eval {}. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
| Kiber_rat |
|
||||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Если речь идет о *nix системе, то пробелы можно заэкранировать, т.е. вызов твоей get.szmhdat будет выглядеть так:
или такой пример:
А вобще, если тебе нужно организовать нормальную передачу данных между двумя программами, то стоит почитать про Unix Socket... -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||||
|
|||||||
| Guest |
|
|||
|
Unregistered |
Система AIX.
Из printzebra.pl у меня вызывается скрипт get.szmhdat вот таким образом: $szmhdat=`~/get.szmhdat $te "$lot" "$artikul"` Передаваемые скрипту lot и artikul могут иметь в себе пробелы. Как скрипт get.szmhdat может эти параметры преобразовать в переменные? Может быть тут как то можно обойтись даже без перла? Пока что у меня te=$1 shift lot=$1 shift artikul=$* Но если в lot'e будет пробел, то ничерта работать не будет. Вот теперь, наверное, проблема описана конкретнее некуда |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Получаешь их через массив @ARGV, где первый элемент массива - это первый параметр, второй - это второй и т.д. Разумеется отсчёт начинается с нуля.
Может вообще стоит написать программу get.szmhdat в виде класса или модуля? Жить будет проще. Это сообщение отредактировал(а) korob2001 - 22.11.2005, 11:28 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| sharq |
|
||||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Если get.szmhdat - perl-скрипт, то поставь в начало такую строку:
Тебе на них все равно, perl сам разберется.
Все стоп-символы - экранируются. Это сообщение отредактировал(а) sharq - 22.11.2005, 11:47 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||||
|
|||||||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Вот тебе пример класса, сохрани его как DBX.pm
А вот пример кода, который использует наш класс. Сохрание его в тот же каталог, где ты сохранил класс имя можешь выбрать любое, лишь бы расширение было как у выполняемого файла .pl, .cgi и т.д.
Такой способ передачи параметров намного безопаснее да и надёжнее, того что я приводил выше, т.е. через командную строку. Это сообщение отредактировал(а) korob2001 - 22.11.2005, 12:11 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Ребят, огромное вам спасибо за помощь.
Из всех примеров наиболее доступным мне показался вот этот:
Дело в том, что всё это должно быть максимально простым, что бы начальство cмогло всё понять, т.к. я объяснить не смогу Тут у нас перл толком почти никто не знает... Теперь о коде. Обращение к перлу действительно нужно оформить в виде perl -e ``. Можно разложить эту строку кода на русский язык? Что ставить вместо param\ one? Переменной, содержащий этот параметр у меня пока нет, если поставить $1 - то будет просто учтёно первое "слово" после команды...а не первый параметр. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Этот код не совсем то, что тебе нужно, так как этим кодом Kiber_rat хотел показать как экранировать параметры *nix системах. Теперь расшифрую строку выше: perl - Запускаем Perl -e - указывает Perl, что программа написана в терминале 'print ++$i, " $_\n" for (@ARGV)' - код программы param\ one param\ two param\ three - параметры Т.е. всё это не нужно сохранять в файл, всё это дело вводишь в терминал и получаешь результат выполнения программы. В данном случае, она тебе просто выведет полученные параметры в виде пронумерованных строк. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
уфф...второй день мучений, а я всё на том же месте=(
Это шел (или как там правильно сказать) скрипт, со строчкой на перле.
Перл то с ними разберётся, но кто разберётся с перлом?) Вернёмся к
Я пытался привести скрипт к этому виду:
На запуск этой команды таким образом
получаю
Я так понимаю, не могу использовать глобальную переменную? Какую? Ведь кроме переменной my, которую я сам и объявляю тут ничего нет....? |
||||||||||||||
|
|||||||||||||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
А зачем ты вообще пытаешься скрестить Shell с Perl? Perl - достаточно мощьный язык программирования, что бы решить поставленную задачу.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Дело в том, что Шел я знаю хоть как то...С Перлом же столкнулся впервые. Это была причина номер раз. Причина номер два - у нас ни одного скрипта на чистом перле не существует, отчасти потому, что его тут мало кто знает. Можете помочь решить проблему путём вставки в код шелл фрагмент перлового кода, который должен просто корректно вытаскивать аргументы? Что в моём файле сейчас не верно? PS: Сейчас нашёл возможность шела воспринять все аргументы не только как args=$*, но и как args=$@, при этом они будут отделены запятыми, что однозначно определит конец аргумента 1 и начала аргумента 2, в отличие от пробела. Буду рыть в этом направлении, возможно выйдет обойтись без перла. |
|||
|
||||
| Kiber_rat |
|
||||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
CrazyDiamond вот тут
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||||
|
|||||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |