![]() |
|
Модераторы: 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
|
||||||
|
|||||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Если параметры команды - qwe123 qwe 123 q w e123
qwe123 - параметр1 qwe 123 - параметр2 q w e123 - параметр3 То что будет содержаться в $te,$art и $charge ?
Я их хочу использовать в запросе: where bestand.ltenr=$te and art_ref.szartnr=$art and bestand.szcharge=$charge |
|||
|
||||
| sharq |
|
||||||||||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Ай-яй-яй!
CrazyDiamond
Если параметры задаются в ручную, то нужно так:
Если через переменные, то
Если через @ARGV, то
или
И все будет окей, и чего ты прицепился к этим пробелам? Они экранируются, если ты их задаешь не вручную, а через переменные! Это сообщение отредактировал(а) sharq - 22.11.2005, 17:42 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||||||||||
|
|||||||||||||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Блин, я их не задаю, я их должен извлечь, а задаются они другой программой! (см начало)
Эта "программа" не знает какая строка в какой переменной сидит и я не вижу способа заставить её понять это! |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Млин, ну ты даёшь. Я вообще уже нифига не пойму.
Смотри вот так излекаются параметры:
Вот и всё, я просто с Informix никогда не работал, если хочешь могу привести пример работы с MySQL, хотя с другой стороны я тебе уже привёл пример класса. Посмотри его код, он расчитан на MySQL, но его так же легко настроить и на другую БД. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Kiber_rat |
|
|||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
sharq Чего ай-ай?
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
korob2001, я тоже не знаю как правильно в информиксе, но делаю это так
Запрос из шэла, имеется ввиду. echo "трали-вали" | /home/informix/bin/dbaccess xlvs Завтра приедет начальник, если скажет - разбирайся сам, то попробую get.szmhdat целиком выполнить на перле и дать расширение .pl. Попробую сделать как korob2001 посоветовал в последнем посте. Хотя как из переменной $sql сделать запрос в перле к информиксу я не знаю. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Залей и установи следующий модуль:
DBD::Informix http://search.cpan.org/~johnl/DBD-Informix....02/Informix.pm DBI http://search.cpan.org/~simkin/Apache-Logg...DBI-0.12/DBI.pm Добавлено @ 01:49 Залей и установи следующий модуль: DBD::Informix http://search.cpan.org/~johnl/DBD-Informix....02/Informix.pm DBI http://search.cpan.org/~simkin/Apache-Logg...DBI-0.12/DBI.pm Примеры смотри там же. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
CrazyDiamond давай поступим так - ты выкладывай сюда свои два скрипта и мы посмотрим, что там не так, а-то ты уже столько времени не можешь толком объяснить что не так.
Так что ждем скрипты. -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Давайте немного отвлечёмся
Есть фрагмент шел кода:
Команда запускается так: ./get.szmhdat_new 803751 [[[[21967-142]]]] [[[[30504/01.03.073]]]] Вопрос: почему ничего не записывается в a1 и следовательно art? Хотя $1 содержит то,что нужно. Только со скобками=) |
|||
|
||||
| Kiber_rat |
|
||||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Потому что вот тут
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||||
|
|||||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Я имею ввиду, что $* = все параметры команды...Для шела эта так,если я не ошибаюсь.
perl -e '$_ ="$*" даёт тот же результат. |
|||
|
||||
| Kiber_rat |
|
||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Попробуй так:
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||
|
|||||
| korob2001 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Попробуй такое регулярное выражение:
Хотя не понятно зачем ты захватываешь второй параметр, если он у тебя отбрасывается. Может тебе нужно это?
Если же тебе нужен только первый параметр, то удали скобки из первого выражения:
Или же оставь, но тогда не далай захвата:
Это сообщение отредактировал(а) korob2001 - 23.11.2005, 15:35 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||
|
|||||||||
| Guest |
|
||||||||||
|
Unregistered |
Kiber_rat, сделал как ты предложил:
Получаю:
То есть параметр 1 и 2 воспринимаются как бы правильно, только скобки лишние.... Но в charge не записывается второй параметр Что означает $*` в конце перловой строки?
Мне нужно извлечь все три параметра. С первым, я надеюсь, вопросов нет? Второй я захватываю в переменную art, третий - в charge. Я не могу сделать просто te=$1 art=$2 и charge=$3 потому,что во втором и третем параметры могут быть пробелы, понимаешь? |
||||||||||
|
|||||||||||
| Гость_CrazyDiamond |
|
|||
|
Unregistered |
Суть вопроса наверное сводится к тому, что бы откинуть скобки, что бы в art записалось 10706154, а в charge 03-0030-05 или 03 0030 05,если этот параметр так будет передан.
|
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Так, тут единичку....Работает, но со скобками. Скобки ща буду отдельно удалять, заменяя шаблон [ и ] на ...пустой символ? Как он выглядит? Пробел врят ли подойдёт, хотя попробую. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
CrazyDiamond - не нужно ничего отдельно удалять, напиши нормальное регулярное выражени.
Вот это выражение не работатает, рабочий пример смотри выше. Приведи полный пример всех трёх параметров, отдельно на каждой строке. Это сообщение отредактировал(а) korob2001 - 24.11.2005, 12:41 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Я уже приводил выше:
Эти параметры можно передавать, заключая их, например в скобки, кавычки итд. Это сообщение отредактировал(а) CrazyDiamond - 24.11.2005, 12:51 |
||||
|
|||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Только я не пойму: Зачем запихивать все параметры в одну строку, что бы потом их отпарсивать? Не проще ли было бы передать их в виде списка? После чего массив @ARGV содержал бы все параметры как отдельные элементы. Это сообщение отредактировал(а) korob2001 - 24.11.2005, 13:20 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Я не знаю как это сделать...Как можно сделать так, что бы перл программа А на автомате запускала шел скрипт Б и передавала ему некий список значений.
Все параметры мне нужны в отдельных переменных...и разумеется, каждый раз параметры будут передаваться разные. Чёрт с ним, сдаюсь. |
||||
|
|||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
А как ты запускаешь Shell из терминала? - это один способ. Второй заключается в сокетном соединении.
Вообще в Shell есть такое понятие как массив и список?
Ну вот тебе отдельные переменные.
Это сообщение отредактировал(а) korob2001 - 24.11.2005, 13:48 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| CrazyDiamond |
|
||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Как должна выглядеть строчка
Не работают....кавычки пробовал разные, всё одно. В переменной te пусто.
Это сообщение отредактировал(а) CrazyDiamond - 24.11.2005, 14:08 |
||||||||||
|
|||||||||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Послушай, давай напишем всё это на Perl, потому как не имеет смысла писать этого на Shell, если ты не знаешь есть ли в Shell массивы или списки. На одних переменных ты далеко не выедешь. Программа будет работать куда надёжнее, без лишних процессов, вобщем без гемороя.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Всё работает, осталось понять как в
my $prm = "[[[[qwe123]]]] [[[[qwe 123]]]] [[[[q w e123]]]]"; вставить все параметры скрипта, явно не указывая их. $* и @ARGV с любыми сочетаниями кавычек не работают=\ |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Но это не есть хорошее решение, соединять все параметры в строку, затем парсить её, для того, что бы их разделить. Это сообщение отредактировал(а) korob2001 - 24.11.2005, 14:53 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Я хоть чуть чуть понимаю
Я не использую эту строку.
Все данные выводятся как и должны. Вот только это всё равно не конец - я не могу использовать скрипт в таком виде, параметры будут передаваться каждый раз разные, а тут они прописаны жёстко. Сижу-читаю книжки....есть идеи? |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ну так подставь переменные вместо параметров. А вообще откуда они берутся, я имею ввиду параметры?
Это сообщение отредактировал(а) korob2001 - 24.11.2005, 15:17 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Блин, ну перл же не знает, что хранится в этих переменных, они пустые! Всё это - ради того, что бы их заполнить,а ты говоришь - подставь их и всё!
Ни один из приведённых выше вариантов не работает, т.к. для переменные te art и charge ещё пустые.
Первые строки первого поста:
Т.е. скрипт запускается основной программой вместе с параметрами. Это сообщение отредактировал(а) CrazyDiamond - 24.11.2005, 15:24 |
||||||||
|
|||||||||
| Kiber_rat |
|
|||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Давай пдойдем к задаче логически
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
|||
|
||||
| korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Так он их вроде, как я понял, отделяет [[[[param1]]]][[[[param2]]]][[[[param3]]]]. Но я не пойму зачем объединять все параметры в одну строку и потом разбивать эту строку, если можно их передать как список?
Может пора уже код сохранить в отдельный файл? Или так и будем писать всё в командной строке?
А Shell не интерполирует переменные? Если нет тогда нужно формировать системную команду в виде строки, а затем эту переменную вставлять в обратные кавычки. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
| CrazyDiamond |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Да, я заключаю все параметры в скобки, т.о. обозначаю начало и конец параметра.
Перловый код является небольшим фрагментом шел скрипта. Так что это не совсем командная строка Я не вижу смысла переходить к написанию всего,включая SQL запрос,на перле. Если у меня проблемы с такой элементарщиной, то куда там писать всё на перле....Или я не вижу какой то очевидной причины перехода от шела на перл?
Они передаются строкой $szmhdat=`~/get.szmhdat_new [[[[$te]]]] [[[[$art]]]] [[[[$charge]]]]` Ты хочешь сказать, что их можно передать, указав вмето параметров имя массива(списка), который будет задан строкой выше?И потом не придётся ничего парсить и ломать голову над тем, как их воспринять и разделить? Про интерполяцию переменных я тебе ничего не могу сказать, не знаю что это такое. Хотя может быть и знаю, но под более простым названием |
||||
|
|||||
| korob2001 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Всё верно, но этот код Shell передаёт оболочке, та в свою очередь зупускает отдельнай процесс perl и тот в свою очередь выполняет этот код. Не важно введёшь ты этот кодв терминал или будешь передавать его из Shell. Твой код уже достаточно большой, что бы писать его в отдельном файле.
Всё верно ты делаешь, только скобки убери, примерно будет это выглядеть так:
Зачем такое кол во скобок? Почему не по 10 с каждой стороны?
Это когда переменная подставляет своё значение, а не имя. Например:
Теперь переменная $c содержит строку "Hello, world!\n", но не "$a, $b!\n"; -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||
|
|||||||||||
| CrazyDiamond |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Получаю hello world! Так что видимо работает. Только ты пример приводил на перле, а я на шеле.
Ну не в этом суть
Дык если я их уберу, то как их можно будет разделить на первую,вторую, третью...?? Скобки в самих переменных не содержаться. |
||||||
|
|||||||
| korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Если ты их уберёшь, тогда нам не нужно будет их обрезать следующим шаблоном. Собственно благодаря ему их и нет в, получающей параметры, программе.
Вот смотри, я твою Perl программу разложил по строкам, теперь давай посмотрим и хорошо подумаем. Что же она делает? И нужна ли она вообще?
Может вообще не нужно ничего и никуда передавать? Ты сам себя запутываешь, зря ты смешиваешь Shell и Perl. Это сообщение отредактировал(а) korob2001 - 25.11.2005, 17:30 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Повторяю в энный раз.
Программа A запускается с параметрами в виде трёх переменных. Они содержат примерно вот такую фигню: 610000 ARTIKUL S PROBELOM PARTIA S PROBELOM Т.е. программа запускается вот так: $szmhdat=`~/get.szmhdat_new '$te' '$art' '$charge'`; А фактически: $szmhdat=`~/get.szmhdat_new 610000 ARTIKUL S PROBELOM PARTIA S PROBELOM Задача: Построить в этой программе А SQL запрос, используя переданный номер, артикул и партию. Проблема: как загнать в переменные, для дальнейшего использования, переданные параметры? Вариант решения - передать параметры так, что бы как то можно было понять, где кончается первый параметр и начинается второй. Смысл скобок теперь ясен? Разумеется, для построения запроса они не нужны. Хотелось бы заметить, что не стоит ломать голову, если влом. Я просто думал, что это несколько проще, чем оказалось. |
|||
|
||||
| Kiber_rat |
|
||||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Так, я уже с трудом понимаю что тебе нужно
Первым параметром скрипт принимает строку аргументов (всю, со скобками) а вторым - номер аргумента который надо вернуть... Далее твой bash:
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||||
|
|||||||
| sharq |
|
||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
CrazyDiamond
Необходимо пробелы, которые встречаются в переменных - экранировать или заменить на какой-нить символ, редко встречающийся в данном контексте. Поэтому вот:
Программа get.szmhdat_new
И далее можно строить SQL-запрос. Это сообщение отредактировал(а) sharq - 28.11.2005, 13:02 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||
|
|||||||
| CrazyDiamond |
|
||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Не работает, возвращает в три строки первый аргумент.
Кроме того Can't locate warnings.pm. Эту строку убрал из кода. И добавил путь к getarg.pl, иначе не находил файл.
Что конкретно ты не понимаешь? Я уже не знаю что можно добавить, поэтому только повторяюсь, пытаясь вновь обрисовать задачу
Уже сто раз писал, чистые параметры имеют вид: 610000 ARTIKUL S PROBELOM PARTIA S PROBELOM Но передаю я их с ограничителями - скобками.
А возвращает всегда первый аргумент. $rt Вы мне вот что скажите...
Вот почему перл эту строчку не обрабатывает?? Тут же всё верно...Если вместо $* просто перечислить параметры как они идут, т.е.
то всё отлично работает, но подставляя переменную $* - не обрабатывает Это сообщение отредактировал(а) sharq - 28.11.2005, 13:25 |
||||||||||||||
|
|||||||||||||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
CrazyDiamond чем тебя не устраивает мой пример, он вполне рабочий!
-------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Я его не видел, когда начал писать ответ.
Я не знаю, как на перле сделать запрос к базе Сейчас пытаюсь записать твой вариант в виде строки в шеле... |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
А тебе не кажется, что за это время, сколько мы тут пытаемся скрестить Shell с Perl, можно было уже 20 раз прочесть документацию по модулям DBI и DBD::Informix? Это сообщение отредактировал(а) korob2001 - 28.11.2005, 14:09 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
Начинать надо с азов...сначала я хочу разобраться в шеле и в простых вставочках перла.
Кроме того, если до на каждой странице кто то что то не понимает, то уж куда тут до результатов Вот переписал твой код, sharq, для извлечения второга параметра...
...на что мне отвечают: Can't modify scalar ref constructor in substitution at -e line 1, near "s/\^/ /g;" А так всё выглядит правильно....... |
|||
|
||||
| sharq |
|
||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
-------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||
|
|||||
| CrazyDiamond |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
syntax error at -e line 1, near "my =" Execution of -e aborted due to compilation errors.
syntax error at -e line 1, near "=" Execution of -e aborted due to compilation errors. Я вокруг подобного предложения уже который день пляшу...собственно, этот вариант наверное самый короткий, вот только как его правильно записать. |
||||
|
|||||
| Kiber_rat |
|
||||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
По поводу моего кода... Ты говоришь что возвращяет только первый аргумент, а можно узнать в каком виде ты передавал их bash скрипту? В моем примере предполагалось что так:
По поводу последней ошибки про которую ты писал: код perl надо писать в одинарных кавычках.
Это сообщение отредактировал(а) Kiber_rat - 28.11.2005, 20:20 -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||||
|
|||||||
| CrazyDiamond |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
баш сприпт запускал ./get.szmhdat_new [[[610000]]] [[[ARTIKUL S PROBELOM]]] [[[PARTIA S PROBEL]]] Выдаёт в три строки первый параметр...
Проверил - один хрен...А что за qwe asd zxc в конце скрипта? |
||||
|
|||||
| CrazyDiamond |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 21.11.2005 Где: Москва Репутация: нет Всего: нет |
УРА ТОВАРИШИ!!! Пришёл старший и методом научного тыка за 10 минут всё сделал...
Кавычки то, сперва двойные, а потом одинарные - "'$1'"...вот в чём было дело Теперь осталось только подправить исходную программу, что бы она все эти параметры передавала без пробелов, с крышой. Всем спасибо, но я ещё вернусь
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |