Модераторы: 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   Вверх
CrazyDiamond
Дата 22.11.2005, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
sharq
Дата 22.11.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Цитата(Kiber_rat @ 22.11.2005, 17:50)
`perl -e 'use strict;'`   

Ай-яй-яй! smile
Код

`perl -Mstrict -e"my ($te,$art,$charge)=@ARGV;"`


CrazyDiamond

Цитата(CrazyDiamond @ 22.11.2005, 18:19)
Если параметры команды - qwe123 qwe 123 q w e123
qwe123 - параметр1
qwe 123 - параметр2
q w e123 - параметр3

Если параметры задаются в ручную, то нужно так:
Код

program "qwe123" "qwe 123" "q w e123"

Если через переменные, то
Код

my $te = "qwe123";
my $art = "qwe 123";
my $charge = "q w e123";

`program $te $art $charge`;

Если через @ARGV, то
Код

my ($te,$art,$charge)=@ARGV;
`program $te $art $charge`;

или
Код

`program @ARGV`;


И все будет окей, и чего ты прицепился к этим пробелам? Они экранируются, если ты их задаешь не вручную, а через переменные!

smile

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


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


Шустрый
*


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

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



Блин, я их не задаю, я их должен извлечь, а задаются они другой программой! (см начало)
Эта "программа" не знает какая строка в какой переменной сидит и я не вижу способа заставить её понять это! smile
PM MAIL ICQ   Вверх
korob2001
Дата 22.11.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

my( $te, $art, $charge) = @ARGV;

# Здест строишь запрос к базе
my $sql = "SELECT * FROM TableName ";
$sql .= "WHERE bestand.ltenr='$te' ";
$sql .= "AND art_ref.szartnr='$art' ";
$sql .= "AND bestand.szcharge='$charge'";

# Теперь переменная $sql содержит строку запроса
# Здесь делаешь этот запрос к базе

Вот и всё, я просто с Informix никогда не работал, если хочешь могу привести пример работы с MySQL, хотя с другой стороны я тебе уже привёл пример класса. Посмотри его код, он расчитан на MySQL, но его так же легко настроить и на другую БД.


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


MACMANIAC
**


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

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



sharq Чего ай-ай? smile Я цитировал код CrazyDiamond-а! smile


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


Шустрый
*


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

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



korob2001, я тоже не знаю как правильно в информиксе, но делаю это такsmile
Запрос из шэла, имеется ввиду.
echo "трали-вали" | /home/informix/bin/dbaccess xlvs

Завтра приедет начальник, если скажет - разбирайся сам, то попробую get.szmhdat целиком выполнить на перле и дать расширение .pl.
Попробую сделать как korob2001 посоветовал в последнем посте. Хотя как из переменной $sql сделать запрос в перле к информиксу я не знаю.
PM MAIL ICQ   Вверх
korob2001
Дата 23.11.2005, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 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

Примеры смотри там же.


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


Perl Liker
**


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

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



CrazyDiamond давай поступим так - ты выкладывай сюда свои два скрипта и мы посмотрим, что там не так, а-то ты уже столько времени не можешь толком объяснить что не так. smile

Так что ждем скрипты.

smile


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


Шустрый
*


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

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



Давайте немного отвлечёмсяsmile
Есть фрагмент шел кода:
Код

te=$1 #передача первого параметра, он не может содержать пробелы.
shift    #сдвиг, первый параметр нам больше не нужен.

art=`perl -e '$_ = '$*'; $a1 =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$1/; print $a1'`

#присваиваю общей переменной $_ значение всех параметров команды ($*), сравниваю $_ с первой переменной, #которую perl должен по идее сам должен вычленить из $*. И найденную первую переменную записываю в $a1

echo $a1 "a1"   #не выводится
echo $1 "1"       #выводится со скобками
echo $art "art"  #не выводится
exit


Команда запускается так:
./get.szmhdat_new 803751 [[[[21967-142]]]] [[[[30504/01.03.073]]]]

Вопрос: почему ничего не записывается в a1 и следовательно art? Хотя $1 содержит то,что нужно. Только со скобками=)
PM MAIL ICQ   Вверх
Kiber_rat
Дата 23.11.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


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

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



Потому что вот тут
Код

perl -e '$_ = '$*'
надо использовать двойные кавычки, вот так
Код

perl -e '$_ ="$*"
если я правильно понял то вместо $* должно подставиться значение? Только вот какую переменную ты имеешь тут ввиду? Шеловскую или перловскую?


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


Шустрый
*


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

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



Я имею ввиду, что $* = все параметры команды...Для шела эта так,если я не ошибаюсь.
perl -e '$_ ="$*" даёт тот же результат.

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


MACMANIAC
**


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

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



Попробуй так:
Код
art=`perl -e ';$ARGV[0] =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$1/; print $ARGV[0]' $*`



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


Эксперт
****


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

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



Попробуй такое регулярное выражение:
Код

$a1 =~ s/\[+(.*?)\]+\s+\[+(.*?)\]+/$1/;

Хотя не понятно зачем ты захватываешь второй параметр, если он у тебя отбрасывается.
Может тебе нужно это?
Код

$a1 =~ s/\[+(.*?)\]+\s+\[+(.*?)\]+/$1 $2/;

Если же тебе нужен только первый параметр, то удали скобки из первого выражения:
Код

$a1 =~ s/\[+(.*?)\]+\s+\[+.*?\]+/$1/;

Или же оставь, но тогда не далай захвата:
Код

$a1 =~ s/\[+(.*?)\]+\s+\[+(?:.*?)\]+/$1/;


Это сообщение отредактировал(а) korob2001 - 23.11.2005, 15:35


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


Unregistered











Цитата(Kiber_rat @ 23.11.2005, 14:59)
Попробуй так:
Код
art=`perl -e ';$ARGV[0] =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$1/; print $ARGV[0]' $*`

Kiber_rat, сделал как ты предложил:
Код


#!/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

te=$1
shift

art=`perl -e ';$ARGV[0] =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$1/; print $ARGV[0]' $*`
charge=`perl -e ';$ARGV[0] =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$2/; print $ARGV[0]' $*`

echo $1 "1"
echo $2 "2"
echo $art "art"
echo $charge "charge"
exit

Получаю:

Цитата
[[[[10706154]]]] 1
[[[[03-0030-05]]]] 2
[[[[10706154]]]] art
[[[[10706154]]]] charge

То есть параметр 1 и 2 воспринимаются как бы правильно, только скобки лишние....
Но в charge не записывается второй параметрsmile
Что означает $*` в конце перловой строки?

Цитата
Хотя не понятно зачем ты захватываешь второй параметр, если он у тебя отбрасывается.
Может тебе нужно это?

Мне нужно извлечь все три параметра. С первым, я надеюсь, вопросов нет? Второй я захватываю в переменную art, третий - в charge.
Я не могу сделать просто te=$1
art=$2 и charge=$3 потому,что во втором и третем параметры могут быть пробелы, понимаешь?
  Вверх
Гость_CrazyDiamond
Дата 24.11.2005, 12:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Суть вопроса наверное сводится к тому, что бы откинуть скобки, что бы в art записалось 10706154, а в charge 03-0030-05 или 03 0030 05,если этот параметр так будет передан.
  Вверх
CrazyDiamond
Дата 24.11.2005, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
art=`perl -e ';$ARGV[0] =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$1/; print $ARGV[0]' $*`
charge=`perl -e ';$ARGV[0] =~ s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$2/; print $ARGV[0]' $*`

Так, тут единичку....Работает, но со скобками. Скобки ща буду отдельно удалять, заменяя шаблон [ и ] на ...пустой символ?
Как он выглядит? Пробел врят ли подойдёт, хотя попробую.
PM MAIL ICQ   Вверх
korob2001
Дата 24.11.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



CrazyDiamond - не нужно ничего отдельно удалять, напиши нормальное регулярное выражени.
Код

s/\[\[\[\[(\w*)\]\]\]\] \[\[\[\[(\w*)\]\]\]\]/$1/;

Вот это выражение не работатает, рабочий пример смотри выше.
Приведи полный пример всех трёх параметров, отдельно на каждой строке.

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


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


Шустрый
*


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

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



Цитата
Приведи полный пример всех трёх параметров, отдельно на каждой строке.


Я уже приводил выше:
Цитата
Если параметры команды - qwe123 qwe 123 q w e123
qwe123 - параметр1
qwe 123 - параметр2
q w e123 - параметр3


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

Это сообщение отредактировал(а) CrazyDiamond - 24.11.2005, 12:51
PM MAIL ICQ   Вверх
korob2001
Дата 24.11.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#!/usr/bin/perl -w
use strict;
my @result = ();
# Я так понимаю, ты передаёшь все параметры в виде строки
my $prm = "[[[[qwe123]]]] [[[[qwe 123]]]] [[[[q w e123]]]]";
$prm =~ s/\[+(.*?)\]+\s*?/push(@result,$1)/eg;
# Начиная отсюда, массив @result содержит все параметры.
print join("\n", @result);

Только я не пойму: Зачем запихивать все параметры в одну строку, что бы потом их отпарсивать? Не проще ли было бы передать их в виде списка? После чего массив @ARGV содержал бы все параметры как отдельные элементы.

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


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


Шустрый
*


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

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



Цитата
Только я не пойму: Зачем запихивать все параметры в одну строку, что бы потом их отпарсивать? Не прощели было бы передать их в виде списка? После чего массив @ARGV содержал бы все параметры как отдельные элементы.


Я не знаю как это сделать...Как можно сделать так, что бы перл программа А на автомате запускала шел скрипт Б и передавала ему некий список значений.

Цитата
7:# Начиная отсюда, массив @result содержит все параметры.

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

Чёрт с ним, сдаюсь.
PM MAIL ICQ   Вверх
korob2001
Дата 24.11.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Ну вот тебе отдельные переменные.
Код

$result[0]; # Параметр 1
$result[1]; # Параметр 2
$result[2]; # Параметр 3


Это сообщение отредактировал(а) korob2001 - 24.11.2005, 13:48


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


Шустрый
*


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

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



Как должна выглядеть строчка
Цитата
my $prm = "[[[[qwe123]]]] [[[[qwe 123]]]] [[[[q w e123]]]]";
?

Код

my $prm = "$*"; 
и
Код

my $prm = "@ARGV";


Не работают....кавычки пробовал разные, всё одно. В переменной te пусто.

Код

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




Цитата
Вообще в Shell есть такое понятие как массив и список?
А вот не знаю...

Это сообщение отредактировал(а) CrazyDiamond - 24.11.2005, 14:08
PM MAIL ICQ   Вверх
korob2001
Дата 24.11.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Послушай, давай напишем всё это на Perl, потому как не имеет смысла писать этого на Shell, если ты не знаешь есть ли в Shell массивы или списки. На одних переменных ты далеко не выедешь. Программа будет работать куда надёжнее, без лишних процессов, вобщем без гемороя.


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


Шустрый
*


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

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



Всё работает, осталось понять как в
my $prm = "[[[[qwe123]]]] [[[[qwe 123]]]] [[[[q w e123]]]]";
вставить все параметры скрипта, явно не указывая их.
$* и @ARGV с любыми сочетаниями кавычек не работают=\
PM MAIL ICQ   Вверх
korob2001
Дата 24.11.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

my $prm = join(" ", @ARGV);

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

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


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


Шустрый
*


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

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



Я хоть чуть чуть понимаюsmile
Я не использую эту строку.

Код

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

echo $te "te"
echo $art "art"
echo $charge "charge"

Все данные выводятся как и должны. Вот только это всё равно не конец - я не могу использовать скрипт в таком виде, параметры будут передаваться каждый раз разные, а тут они прописаны жёстко.
Сижу-читаю книжки....есть идеи?
PM MAIL ICQ   Вверх
korob2001
Дата 24.11.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну так подставь переменные вместо параметров. А вообще откуда они берутся, я имею ввиду параметры?

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


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


Шустрый
*


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

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



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

Блин, ну перл же не знает, что хранится в этих переменных, они пустые! Всё это - ради того, что бы их заполнить,а ты говоришь - подставь их и всё!

Код

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

Ни один из приведённых выше вариантов не работает, т.к. для переменные te art и charge ещё пустые.


Цитата
А вообще откуда они берутся, я имею ввиду параметры?

Первые строки первого поста:
Цитата
Есть некая команда printzebra.pl
В процессе своего выполнения она запускает файл get.szmhdat с параметрами X Y Z.

Т.е. скрипт запускается основной программой вместе с параметрами.

Это сообщение отредактировал(а) CrazyDiamond - 24.11.2005, 15:24
PM MAIL ICQ   Вверх
Kiber_rat
Дата 24.11.2005, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


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

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



Давай пдойдем к задаче логически smile У тебя несколько параметров, разделенных пробелами, каждый из которых может содержать пробелыы. Если так, то отделить каждый параметр практически невозможно, поскольку невозможно опредлить формальное правило для идентификации параметров. Вот если ты можешь передать параметры с другим разделителем, который заведомо не может встретиться в параметре (запятая, циркумфлекс, табуляция), тогда можно легко написать скрипт, который примет параметры и разложит их по переменным.


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


Эксперт
****


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

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



Цитата

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

Так он их вроде, как я понял, отделяет [[[[param1]]]][[[[param2]]]][[[[param3]]]]. Но я не пойму зачем объединять все параметры в одну строку и потом разбивать эту строку, если можно их передать как список?
Код

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

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

Блин, ну перл же не знает, что хранится в этих переменных, они пустые! Всё это - ради того, что бы их заполнить,а ты говоришь - подставь их и всё!

А Shell не интерполирует переменные? Если нет тогда нужно формировать системную команду в виде строки, а затем эту переменную вставлять в обратные кавычки.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
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   Вверх
CrazyDiamond
Дата 29.11.2005, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

баш сприпт запускал
./get.szmhdat_new [[[610000]]] [[[ARTIKUL S PROBELOM]]] [[[PARTIA S PROBEL]]]
Выдаёт в три строки первый параметр...

Цитата
проверь...

Проверил - один хрен...А что за qwe asd zxc в конце скрипта?
PM MAIL ICQ   Вверх
CrazyDiamond
Дата 29.11.2005, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



УРА ТОВАРИШИ!!! Пришёл старший и методом научного тыка за 10 минут всё сделал...
Кавычки то, сперва двойные, а потом одинарные - "'$1'"...вот в чём было делоsmile
Теперь осталось только подправить исходную программу, что бы она все эти параметры передавала без пробелов, с крышой.
Всем спасибо, но я ещё вернусьsmile

Код

#!/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

te=`perl -e '$te="'$1'";$te =~ s/\^/ /g;print "$te"'`
art=`perl -e '$art="'$2'";$art =~ s/\^/ /g;print "$art"'`
charge=`perl -e '$charge="'$3'";$charge =~ s/\^/ /g;print "$charge"'`

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 nvl(bestand.szcharge,'')='$charge'
and bestand.lasl=art_ref.lasl" | /home/informix/bin/dbaccess xlvs 2>/dev/null | tail -2 | head -1 

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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