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

Поиск:

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 возможны пробелы?
Если пробелов нет - то всё понятно, но вот с пробелами...
PM MAIL ICQ   Вверх
korob2001
Дата 21.11.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что-то вообще ничего не понял. Если можно подробнее.
Я понял так:
1. Ты запускаешь программу printzebra.pl
2. Эта программа должна запусть на выполнение программу get.szmhdat и передать ей три параметра X, Y, Z ( А что за расширение такое у второго файла? ).
3. get.szmhdat должна на основе полученных параметров получить из базы данных, некое значение A и вернуть его программе printzebra.pl

Я правильно понял условие? Если да, то о каких пробелах идёт речь?



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


Шустрый
*


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

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



Ты всё понял правильно.
Точка в get.szmhdat стоит не ради обозначения расширения. Это не важно.

Проблема в том, что я не знаю как передать эти параметры...
Просто на шеле воспринятие параметров команды и перевод их в переменные выглядел бы примерно так:
X=$1
Y=$2
Z=$3
Но если Y состоит из "двух слов", т.е. имеет в себе пробел, то вторая часть уже пойдёт как $3...

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


Эксперт
****


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

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



Можно через системный вызов. Допустим есть программа, которая принимает 3 числа, складывает их и выводит сумму в STDOUT. Я назвал её called.pl
Код

#!/usr/bin/perl -w
use strict;

my( $x, $y, $z ) = @ARGV;

# Ты же подключешь здесь к базе и делаешь запрос
my $a = $x + $y + $z;
print $a;

Следующая программа вызывает пред идущую и передаёт ей 3 параметра, получает результат и ввыводит его в STDOUT.
Код

#!/usr/bin/perl -w
use strict;
my $a = `perl called.pl 10 15 20`;
print $a;

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

my $a = `perl called.pl "param one" "param two" "param three"`;

Только не забудь при передаче параметров, прогнать всё это через eval {}.


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


MACMANIAC
**


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

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



Если речь идет о *nix системе, то пробелы можно заэкранировать, т.е. вызов твоей get.szmhdat будет выглядеть так:
Код

get.szmhdat param\ one param\ two param\ free

или такой пример:
Код

perl -e 'print ++$i," $_\n" for (@ARGV)' param\ one param\ two param\ three

А вобще, если тебе нужно организовать нормальную передачу данных между двумя программами, то стоит почитать про Unix Socket...


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


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 будет пробел, то ничерта работать не будет.
Вот теперь, наверное, проблема описана конкретнее некудаsmile
  Вверх
korob2001
Дата 22.11.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Получаешь их через массив @ARGV, где первый элемент массива - это первый параметр, второй - это второй и т.д. Разумеется отсчёт начинается с нуля.
Код

#!/usr/bin/perl -w
use strict;

my( $x, $y, $z ) = @ARGV; # Получаем параметры

# Ты же подключешь здесь к базе и делаешь запрос
my $a = "$x + $y + $z";
print $a;

Может вообще стоит написать программу get.szmhdat в виде класса или модуля? Жить будет проще.

Это сообщение отредактировал(а) korob2001 - 22.11.2005, 11:28


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


Perl Liker
**


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

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



Цитата(Guest @ 22.11.2005, 11:52)
Как скрипт get.szmhdat может эти параметры преобразовать в переменные?

Если get.szmhdat - perl-скрипт, то поставь в начало такую строку:
Код

print "Сommand line arguments.\n";
my $i;
print ++$i, ":\t$_\n" foreach @ARGV;


Цитата(Guest @ 22.11.2005, 11:52)

Передаваемые скрипту lot и artikul могут иметь в себе пробелы.

Тебе на них все равно, perl сам разберется. smile

Цитата(Guest @ 22.11.2005, 11:52)
Но если в lot'e будет пробел, то ничерта работать не будет.

Все стоп-символы - экранируются.

smile

Это сообщение отредактировал(а) sharq - 22.11.2005, 11:47


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


Эксперт
****


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

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



Вот тебе пример класса, сохрани его как DBX.pm
Код

package DBX;
use DBI;

push( @ISA, "DBI" );

# Конструктор
sub new {
    my $dbx = shift;
    my $class = ref( $dbx ) || $dbx;
    my $self  = { host => "localhost",
                  database => "testbase",
                  login => "root",
                  password => "",
                  driver => "mysql", @_ };
    return bless($self, $class);
}

# Метод подключает к базе и возвращает ссылку
sub connect {
    my $self = shift;
    my $dbh = DBI->connect("DBI:" . $self->{driver} . ":host=" . $self->{host} . ";database=" . $self->{database}, $self->{login}, $self->{password});
    return $dbh;
}

# Метод получает три парамтра ($dbh, x, y, z) и возвращает A
sub getParamA {
    shift;
    my($dbh, $x, $y, $z) = @_;
    my $result = "";
    # На основе полученных параметров строим запрос к базе данных,
    # естественно запрос поменяй на свой
    my $sql = "SELECT a FROM TableName WHERE x='$x' AND y='$y' AND z='$z' LIMIT 1";
    my $sth = $dbh->prepare( $sql );
    my $res = $sth->execute();
    $res += 0;
    if ( $res ) {
       ( $result ) = $sth->fetchrow_array();
    }
    $sth->finish();
    return $result;
}

# Метод получает дескриптор базы и обравает соединение
sub disconnect {
    shift;
    my $dbh = shift;
    $dbh->disconnect();
}

1;

А вот пример кода, который использует наш класс. Сохрание его в тот же каталог, где ты сохранил класс имя можешь выбрать любое, лишь бы расширение было как у выполняемого файла .pl, .cgi и т.д.
Код

#!/usr/bin/perl -w
use strict;
# Указываем Perl, где нужно искать модули
use lib qw(.);
use DBX; # Наш класс
my($x, $y, $z, $result) = ();
$x = "first param";
$y = "second param";
$z = "third param";

# Создаём объект нашего класса, здесь укажи свои данные
my $dbx = DBX->new( host => "localhost",
                    database => "autocat",
                    login => "root",
                    password => "" );

# Подключаемся к базе данных и получаем ссылку
my $dbh = $dbx->connect();

# Передаём 4 параметра и ожидаем возвращаемое значение, но его может и не быть,
# потому делаем это в условии.
if ( $result = $dbx->getParamA($dbh, $x, $y, $z) ) {
     print "Получил: $result\n";
} else {
     print "Значение А не найдено :(\n";
}

# Отключаемся от базы
$dbx->disconnect($dbh);

Такой способ передачи параметров намного безопаснее да и надёжнее, того что я приводил выше, т.е. через командную строку.

Это сообщение отредактировал(а) korob2001 - 22.11.2005, 12:11


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


Шустрый
*


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

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



Ребят, огромное вам спасибо за помощь.
Из всех примеров наиболее доступным мне показался вот этот:

Код

 perl -e 'print ++$i," $_\n" for (@ARGV)' param\ one param\ two param\ three


Дело в том, что всё это должно быть максимально простым, что бы начальство cмогло всё понять, т.к. я объяснить не смогуsmile
Тут у нас перл толком почти никто не знает...

Теперь о коде. Обращение к перлу действительно нужно оформить в виде perl -e ``.
Можно разложить эту строку кода на русский язык?
Что ставить вместо param\ one?
Переменной, содержащий этот параметр у меня пока нет, если поставить $1 - то будет просто учтёно первое "слово" после команды...а не первый параметр.
PM MAIL ICQ   Вверх
korob2001
Дата 22.11.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

perl -e 'print ++$i," $_\n" for (@ARGV)' param\ one param\ two param\ three

Этот код не совсем то, что тебе нужно, так как этим кодом Kiber_rat хотел показать как экранировать параметры *nix системах.
Теперь расшифрую строку выше:
perl - Запускаем Perl

-e - указывает Perl, что программа написана в терминале

'print ++$i, " $_\n" for (@ARGV)' - код программы

param\ one param\ two param\ three - параметры

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


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


Шустрый
*


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

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



уфф...второй день мучений, а я всё на том же месте=(

Цитата
Если get.szmhdat - perl-скрипт, то

Это шел (или как там правильно сказать) скрипт, со строчкой на перле.

Цитата
Цитата
Передаваемые скрипту lot и artikul могут иметь в себе пробелы.

Тебе на них все равно, perl сам разберется

Перл то с ними разберётся, но кто разберётся с перлом?)

Вернёмся к
Код

#!/usr/bin/perl -w
use strict;

my( $x, $y, $z ) = @ARGV; # Получаем параметры

# Ты же подключешь здесь к базе и делаешь запрос
my $a = "$x + $y + $z";
print $a;


Я пытался привести скрипт к этому виду:
Код

#!/bin/sh
export ONCONFIG=onconfig.neo
export INFORMIXSQLHOSTS=/home/informix/etc/sqlhosts
export INFORMIXDIR=/home/informix
export INFORMIXSERVER=onlinex
export CLIENT_LOCALE=ru_RU.CP1251
export DB_LOCALE=ru_RU.CP1251
export SERVER_LOCALE=ru_RU.8859-5
`perl -e 'use strict;'`
`perl -e 'my($te,$art,charge$)=@ARGV'`

echo "select first 1 get_data(szmhdat)
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 2>/dev/null | tail -2 | head -1


На запуск этой команды таким образом
Код

neo:13:37:59~$ ./get.szmhdat_new 610000 10706154 03-0030-05

получаю
Код

Can't use global $) in "my" at -e line 1.
Near character position 4

Я так понимаю, не могу использовать глобальную переменную? Какую? Ведь кроме переменной my, которую я сам и объявляю тут ничего нет....?
PM MAIL ICQ   Вверх
korob2001
Дата 22.11.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А зачем ты вообще пытаешься скрестить Shell с Perl? Perl - достаточно мощьный язык программирования, что бы решить поставленную задачу.


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


Шустрый
*


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

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



Цитата
А зачем ты вообще пытаешься скрестить Shell с Perl? Perl - достаточно мощьный язык программирования, что бы решить поставленную задачу.

Дело в том, что Шел я знаю хоть как то...С Перлом же столкнулся впервые.
Это была причина номер раз. Причина номер два - у нас ни одного скрипта на чистом перле не существует, отчасти потому, что его тут мало кто знает.

Можете помочь решить проблему путём вставки в код шелл фрагмент перлового кода, который должен просто корректно вытаскивать аргументы?
Что в моём файле сейчас не верно?

PS: Сейчас нашёл возможность шела воспринять все аргументы не только как args=$*, но и как args=$@, при этом они будут отделены запятыми, что однозначно определит конец аргумента 1 и начала аргумента 2, в отличие от пробела.
Буду рыть в этом направлении, возможно выйдет обойтись без перла.
PM MAIL ICQ   Вверх
Kiber_rat
Дата 22.11.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


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

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



CrazyDiamond вот тут
Код

`perl -e 'use strict;'`    
`perl -e 'my($te,$art,charge$)=@ARGV'`
у тебя получается что ты делаешь два однострочных скрипта perl. Первый у тебя просто содержит прагму use strict а второй из массива @ARGV получает переменные. Далее, у тебя perl никак не получает переданные bash скрипту параметры. Может так надо:
Код

`perl -e 'use strict; my($te,$art,charge$)=@ARGV' $1 $2 $3`
И дальше что у тебя с этими переменными происходит? Ты их только присвоил и все...


--------------------
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.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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