Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить значения параметров команды? Параметры с пробелами! 
:(
    Опции темы
CrazyDiamond
Дата 25.11.2005, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.11.2005
Где: Москва

Репутация: нет
Всего: нет



Да, я заключаю все параметры в скобки, т.о. обозначаю начало и конец параметра.

Цитата
Может пора уже код сохранить в отдельный файл? Или так и будем писать всё в командной строке?

Перловый код является небольшим фрагментом шел скрипта. Так что это не совсем командная строкаsmile
Я не вижу смысла переходить к написанию всего,включая SQL запрос,на перле. Если у меня проблемы с такой элементарщиной, то куда там писать всё на перле....Или я не вижу какой то очевидной причины перехода от шела на перл?

Цитата
Но я не пойму зачем объединять все параметры в одну строку и потом разбивать эту строку, если можно их передать как список?

Они передаются строкой
$szmhdat=`~/get.szmhdat_new [[[[$te]]]] [[[[$art]]]] [[[[$charge]]]]`
Ты хочешь сказать, что их можно передать, указав вмето параметров имя массива(списка), который будет задан строкой выше?И потом не придётся ничего парсить и ломать голову над тем, как их воспринять и разделить?

Про интерполяцию переменных я тебе ничего не могу сказать, не знаю что это такое. Хотя может быть и знаю, но под более простым названиемsmile
PM MAIL ICQ   Вверх
korob2001
Дата 25.11.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

Перловый код является небольшим фрагментом шел скрипта. Так что это не совсем командная строка
Я не вижу смысла переходить к написанию всего,включая SQL запрос,на перле. Если у меня проблемы с такой элементарщиной, то куда там писать всё на перле....Или я не вижу какой то очевидной причины перехода от шела на перл?

Всё верно, но этот код Shell передаёт оболочке, та в свою очередь зупускает отдельнай процесс perl и тот в свою очередь выполняет этот код. Не важно введёшь ты этот кодв терминал или будешь передавать его из Shell. Твой код уже достаточно большой, что бы писать его в отдельном файле.
Цитата

Они передаются строкой
$szmhdat=`~/get.szmhdat_new [[[[$te]]]] [[[[$art]]]] [[[[$charge]]]]`
Ты хочешь сказать, что их можно передать, указав вмето параметров имя массива(списка), который будет задан строкой выше?И потом не придётся ничего парсить и ломать голову над тем, как их воспринять и разделить?

Всё верно ты делаешь, только скобки убери, примерно будет это выглядеть так:
Код

$szmhdat=`~/get.szmhdat_new '$te' '$art' '$charge'`;

Зачем такое кол во скобок? Почему не по 10 с каждой стороны? smile
Цитата

Про интерполяцию переменных я тебе ничего не могу сказать, не знаю что это такое. Хотя может быть и знаю, но под более простым названием

Это когда переменная подставляет своё значение, а не имя. Например:
Код

# есть переменная содержащая строку
my $a = "Hello";
# Есть ещё одна переменная, тоже содержит строку
my $b = "world";
# В следующей строке происходит интерполяция переменных
my $c = "$a, $b!\n";

Теперь переменная $c содержит строку "Hello, world!\n", но не "$a, $b!\n";


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
CrazyDiamond
Дата 25.11.2005, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.11.2005
Где: Москва

Репутация: нет
Всего: нет



Код

a="hello"
b="world!"
c="$a $b"
echo $c

Получаю
hello world!
Так что видимо работает. Только ты пример приводил на перле, а я на шеле.

Цитата
Зачем такое кол во скобок? Почему не по 10 с каждой стороны?

Ну не в этом сутьsmile

Цитата
Всё верно ты делаешь, только скобки убери, примерно будет это выглядеть так:

Дык если я их уберу, то как их можно будет разделить на первую,вторую, третью...?? Скобки в самих переменных не содержаться.




PM MAIL ICQ   Вверх
korob2001
Дата 25.11.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

Дык если я их уберу, то как их можно будет разделить на первую,вторую, третью...?? Скобки в самих переменных не содержаться.

Если ты их уберёшь, тогда нам не нужно будет их обрезать следующим шаблоном. Собственно благодаря ему их и нет в, получающей параметры, программе.
Код

s/\[+(.*?)\]+\s*?/push(@result,$1)/eg;

Вот смотри, я твою Perl программу разложил по строкам, теперь давай посмотрим и хорошо подумаем. Что же она делает? И нужна ли она вообще?
Код

my @result = ();
my $prm = "$te $art $charge";
$prm =~ s/\[+(.*?)\]+\s*?/push(@result,$1)/eg;
print $result[0];

Может вообще не нужно ничего и никуда передавать? Ты сам себя запутываешь, зря ты смешиваешь Shell и Perl.

Это сообщение отредактировал(а) korob2001 - 25.11.2005, 17:30


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
CrazyDiamond
Дата 26.11.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 запрос, используя переданный номер, артикул и партию.
Проблема: как загнать в переменные, для дальнейшего использования, переданные параметры?

Вариант решения - передать параметры так, что бы как то можно было понять, где кончается первый параметр и начинается второй. Смысл скобок теперь ясен? Разумеется, для построения запроса они не нужны.

Хотелось бы заметить, что не стоит ломать голову, если влом. Я просто думал, что это несколько проще, чем оказалось.
PM MAIL ICQ   Вверх
Kiber_rat
Дата 26.11.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Так, я уже с трудом понимаю что тебе нужно smile Но все таки попробую помочь. Если не подойдет, просто напиши мне пример входящих данных (твои три параметра) и пример исходящих данных (как должен выгляжеть твой SQL запрос)...
Код

#!/usr/bin/perl
use strict;
use warnings;
my @arr = ($ARGV[0] =~ /\[+([^\[\]]+)\]+/g);
print $arr[$ARGV[1]-1];
Это сохраняешь как getarg.pl и ставишь ему 755 (rwxr-xr-x)
Первым параметром скрипт принимает строку аргументов (всю, со скобками) а вторым - номер аргумента который надо вернуть... Далее твой bash:
Код

#!/bin/sh    
tr=`getarg.pl $* 1`
art=`getarg.pl $* 2`
boo=`getarg.pl $* 3`
echo $tr
echo $art
echo $boo



--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
sharq
Дата 28.11.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



CrazyDiamond

Цитата(CrazyDiamond @ 26.11.2005, 14:22)
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


Необходимо пробелы, которые встречаются в переменных - экранировать или заменить на какой-нить символ, редко встречающийся в данном контексте. Поэтому вот:

Код

my $te = 610000;
(my $art = 'ARTIKUL S PROBELOM') =~ s/ /_/g; # все пробелы заменяем на символ подчеркивания 
(my $charge = 'PARTIA S PROBELOM') =~ s/ /_/g; # можно на любой другой, н-р, \0 или |

my $szmhdat = `perl get.szmhdat_new $te $art $charge`; # одинарные кавычки не нужны


Программа get.szmhdat_new
Код

for (my $i=0; $i<@ARGV; $i++) {
 $ARGV[$i] =~ s/_/ /g; # наш символ заменяем обратно на пробел (если это существенно)
 print "$i: $ARGV[$i]\n";
}


И далее можно строить SQL-запрос.

smile

Это сообщение отредактировал(а) sharq - 28.11.2005, 13:02


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
CrazyDiamond
Дата 28.11.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.11.2005
Где: Москва

Репутация: нет
Всего: нет



Не работает, возвращает в три строки первый аргумент.
Кроме того Can't locate warnings.pm. Эту строку убрал из кода. И добавил путь к getarg.pl, иначе не находил файл.

Цитата
Так, я уже с трудом понимаю что тебе нужно

Что конкретно ты не понимаешь? Я уже не знаю что можно добавить, поэтому только повторяюсь, пытаясь вновь обрисовать задачуsmile

Цитата

просто напиши мне пример входящих данных (твои три параметра)

Уже сто раз писал, чистые параметры имеют вид:
610000
ARTIKUL S PROBELOM
PARTIA S PROBELOM
Но передаю я их с ограничителями - скобками.

Цитата

и пример исходящих данных (как должен выгляжеть твой SQL запрос)...


Код

echo "select first 1 szmhdat[7,8]||'.'||szmhdat[5,6]||'.'||szmhdat[1,4]
from art_ref, bestand
where bestand.ltenr=$te
and art_ref.szartnr='$art'
and bestand.szcharge='$charge'
and bestand.lasl=art_ref.lasl" | /home/informix/bin/dbaccess xlvs


Цитата

Первым параметром скрипт принимает строку аргументов (всю, со скобками) а вторым - номер аргумента который надо вернуть...

А возвращает всегда первый аргумент. $rt

Вы мне вот что скажите...
Код

te=`perl -e " my $arg = '[b][u]$*[/u][/b]'; @result = (); $arg =~ s/\[+(.*?)\]+\s*?/push(@result,$1)/eg;print $result[0]"`

Вот почему перл эту строчку не обрабатывает?? Тут же всё верно...Если вместо $* просто перечислить параметры как они идут, т.е.
Код

te=`perl -e 'my @result = (); my $prm = "[[[[610000]]]] [[[[ARTIKUL S PROBELOM]]]] [[[[PARTIA S PROBEL]]]]"; $prm =~ s/\[+(.*?)\]+\s*?/push(@result,$1)/eg;print $result[1]'`

то всё отлично работает, но подставляя переменную $* - не обрабатываетsmile((

Это сообщение отредактировал(а) sharq - 28.11.2005, 13:25
PM MAIL ICQ   Вверх
sharq
Дата 28.11.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



CrazyDiamond чем тебя не устраивает мой пример, он вполне рабочий!


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
CrazyDiamond
Дата 28.11.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.11.2005
Где: Москва

Репутация: нет
Всего: нет



Я его не видел, когда начал писать ответ.

Цитата
то куда там писать всё на перле....

Я не знаю, как на перле сделать запрос к базеsmile
Сейчас пытаюсь записать твой вариант в виде строки в шеле...
PM MAIL ICQ   Вверх
korob2001
Дата 28.11.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

Я не знаю, как на перле сделать запрос к базе

А тебе не кажется, что за это время, сколько мы тут пытаемся скрестить Shell с Perl, можно было уже 20 раз прочесть документацию по модулям DBI и DBD::Informix?

Это сообщение отредактировал(а) korob2001 - 28.11.2005, 14:09


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
CrazyDiamond
Дата 28.11.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.11.2005
Где: Москва

Репутация: нет
Всего: нет



Начинать надо с азов...сначала я хочу разобраться в шеле и в простых вставочках перла.
Кроме того, если до на каждой странице кто то что то не понимает, то уж куда тут до результатовsmile Без обидsmile

Вот переписал твой код, sharq, для извлечения второга параметра...
Код

art=`perl -e "$ARGV[2] =~ s/\^/ /g; print '$ARGV[2]'"`
echo $art

...на что мне отвечают:
Can't modify scalar ref constructor in substitution at -e line 1, near "s/\^/ /g;"
А так всё выглядит правильно.......

PM MAIL ICQ   Вверх
sharq
Дата 28.11.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Цитата(CrazyDiamond @ 28.11.2005, 15:49)
Can't modify scalar ref constructor in substitution at -e line 1, near "s/\^/ /g;"


Код

art=`perl -e "(my $art=$ARGV[2]) =~ s/\^/ /g; print '$art'"`


smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
CrazyDiamond
Дата 28.11.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.11.2005
Где: Москва

Репутация: нет
Всего: нет



Код

art=`perl -e "(my $art=$ARGV[2]) =~ s/\^/ /g; print '$art'"`

syntax error at -e line 1, near "my ="
Execution of -e aborted due to compilation errors.

Код

art=`perl -e "$art=$ARGV[2]; $art =~ s/\^/ /g; print '$art'"`

syntax error at -e line 1, near "="
Execution of -e aborted due to compilation errors.

Я вокруг подобного предложения уже который день пляшу...собственно, этот вариант наверное самый короткий, вот только как его правильно записать.
PM MAIL ICQ   Вверх
Kiber_rat
Дата 28.11.2005, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



По поводу моего кода... Ты говоришь что возвращяет только первый аргумент, а можно узнать в каком виде ты передавал их bash скрипту? В моем примере предполагалось что так:
Код

[[[61000]]][[[ARTIKUL S PROBELOM]]][[[PARTIA S PROBELOM]]]
В этом случае все работает, я проверял несколько раз.
По поводу последней ошибки про которую ты писал:
код perl надо писать в одинарных кавычках.
Код

art=`perl -e '$art=$ARGV[2]; $art =~ s/\^/ /g; print "$art"' qwe asd zxc`
проверь...

Это сообщение отредактировал(а) Kiber_rat - 28.11.2005, 20:20


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1214 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.