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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переписать скрипт shell на perl | опять регулярка 
:(
    Опции темы
ramus
Дата 22.4.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Есть скрипт на shell который читает конфигурационный файл со строками вида
MV /path/to/SRC/dir /path/to/DEST/dir select_CU 
и в данном случае переносит файлы удовлетворяющие условию выборки select_CU из директории /path/to/SRC/dir в директорию /path/to/DEST/dir

правила описаны в файле правил: (для данного примера)
Код

select_CU="grep -ie ^C -e ^U | grep -iv '[.]in_progress$'"


этот shell запускается из cron раз в 5 минут.
Проблема в том, что когда записей в конфигурационном файле стало более 1000, то время работы скрипта составляет более минуты. 
Естественно я взялся переписать все это на перл.

И тут возник идеологический вопрос:
Нужно описать правило отбора файлов в директории (думаю без регулярки не обойтись). Надо наиболее универсально, но чтобы читаемо и просто. Если условие ИЛИ регулярным выражением описывается легко, то условие И не понятно как. например для приведенного выше примера (отобрать все файлы начинающиеся на С или U или с или u)
Код

select_CU="(?i)^[C|U].*"

где 
(?i) - ignore case
но как написать что при этом НЕ заканчивающиеся на *.in_progress ?
Ограничение: в основном коде будет что то типа
if $_ =~ m/${select_CU}/ 
и поэтому все условие должно содержаться в select_CU
Либо так сделать нельзя и что тогда делать? какие варианты?
либо ткните в доку, но чесслово не нашел как :(

к сожалению в реальной жизни все сложнее, есть например такие
Код

select_APL_LOG="grep -ie ^R -ie ^E -ie ^G -ie ^W |
grep -e '^.001000.*' -e '^.100.*' -e '^.101.*' \
 -e '^.103.*' -e '^.105.*' -e '^.106.*' -e '^.107.*' -e '^.108.*' \
 -e '^.123.*' | grep -iv [.]in_progress$ "

как такое переписать  smile ?
(если не знакома команда grep, то отобрать все файлы игнорируя регистр начинающиеся на R или E или G или W 
у которых начиная со второй буквы в имени файла будет 001000 или 100 или 101 или 103 ... И не заканчивающиеся на .in_progress

PM MAIL   Вверх
tolkien
Дата 23.4.2008, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

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



Если вы хотите переписать этот код на PERL и вместо grep использовать регулярные выражения PERL.
Тогда вам надо будет поменять формат записи условий в select_CU писать по другому.

select_CU="grep -ie ^C -e ^U | grep -iv '[.]in_progress$'" здесь выполняються последовательно два grep

grep -ie ^C -e ^U   
grep -iv '[.]in_progress$'" 

на PERL 

/^[cCuU]/
/\.n_progress$/

надо придумать свой разделитель между разными рег. выраж. Например такой  ###

select_CU=^[cCuU]###/\.n_progress$/

потом в коде написать так

@re = split(/###/, select_CU)

и последовательно выполнить каждое рег выражение

foreach my $re (@re)
{
     if ($_ =~ m/$re/)
     {
     } 
}

select_APL_LOG="grep -ie ^R -ie ^E -ie ^G -ie ^W |
grep -e '^.001000.*' -e '^.100.*' -e '^.101.*' \
 -e '^.103.*' -e '^.105.*' -e '^.106.*' -e '^.107.*' -e '^.108.*' \
 -e '^.123.*' | grep -iv [.]in_progress$ "

это переписывается так же как выше написано

 


Это сообщение отредактировал(а) tolkien - 23.4.2008, 03:22
PM MAIL   Вверх
amg
Дата 23.4.2008, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(ramus @  22.4.2008,  23:00 Найти цитируемый пост)
Если условие ИЛИ регулярным выражением описывается легко, то условие И не понятно как.
Любые логические операции можно вставить в один шаблон, правда, иногда это муторное дело. Например
Цитата(ramus @  22.4.2008,  23:00 Найти цитируемый пост)
отобрать все файлы игнорируя регистр начинающиеся на R или E или G или W у которых начиная со второй буквы в имени файла будет 001000 или 100 или 101 или 103 ... И не заканчивающиеся на .in_progress
Код

$select_APL_LOG = '(?!.*\.in_progress$)^(?i:[REGW])(?:001000|10[013])';


PM MAIL   Вверх
amg
Дата 23.4.2008, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Сам скрипт мог бы выглядеть как то так (но я его не проверял!):
Код
die "Usage: $0 config_file(s)\n" unless @ARGV;

use vars qw($select_APL_LOG $select_CU);
$select_APL_LOG = '(?!.*\.in_progress$)^(?i:[REGW])(?:001000|10[013])';
$select_CU      = '(?!.*\.in_progress$)^(?i:[CU])';

while (<>) {
  ($SRC,$DEST,$select) = (split)[1..3];
  unless (-d $SRC && -d $DEST && ${$select}) {
    warn("Bad in $ARGV, line $.\n");
    next;
  }
  
  opendir DIR, $SRC or warn("Can't opendir $SRC: $!\n"),next;
  while (readdir DIR) {
    rename("$SRC/$_", "$DEST/$_") || warn if /${$select}/;
  }
  closedir DIR;
  
  # Более короткая замена предыдущему куску
  #chdir $SRC;
  #rename($_, "$DEST/$_") || warn for grep {/${$select}/} <*>;
}
Только есть у меня сомнения, что perl-скрипт будет быстрее, чем sh-скрипт.



Это сообщение отредактировал(а) amg - 23.4.2008, 07:30
PM MAIL   Вверх
ramus
Дата 23.4.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



2 tolkien
Цитата

надо придумать свой разделитель между разными рег. выраж. 

Да, интересная мысль. Главное просто и универсально. Попробую. Спасибо Вам. И с точки зрения производительности хорошо - при первом совпадении не надо проверять все оставшиеся варианты.

2 amq
стараюсь внимательно читать Ваши посты - так как Вы пишете емко, но с минимумом комментариев. Многие решения нестандартны и интересны. Чувствуется большой опыт программирования. Естественно, то что Вы пишете Вам очевидно. Я с перл только начинаю дружить, поэтому без комментариев  сложновато. Правильно я понял, что в регулярном выражении
$select_APL_LOG = '(?!.*\.in_progress$)^(?i:[REGW])(?:001000|10[013])';
?! - отрицание
?: - не захватывать () в $1  ?
но вот сами три шаблона в скобках как работают не понятно  smile , причем работают правильно 
Код

my $str="r101000a.012";
if ( $str =~ m/(?!.*\.in_progress$)^(?i:[REGW])(?:001000|10[013])/ ) 
  { print "Yes\n"; }
  else
  { print "Not\n"; }

выводит Yes как и должно быть

в кэмелбук таких примеров я не нашел...скорее плохо искал (все таки >1000стр.) 
там есть типа /^(regw).*out$/ . 
то есть в скобках m// один шаблон, а тут три . Они так объединяются по условию И ?

Цитата

Только есть у меня сомнения, что perl-скрипт будет быстрее, чем sh-скрипт.

пока мой опыт переписывания shell скриптов (около десятка) на перл говорит, что перл рулит  smile . Понятно, что если задачу решать в лоб, то не всегда будет существенный выигрыш. Однако перл заставляет (и позволяет) находить нестандартные решения от которых испытываешь кайф когда это начинает работать на порядок быстрее.

PM MAIL   Вверх
ramus
Дата 23.4.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



пространные рассуждения удалил smile так как сам разобрался (поиск рулит)

для того, чтобы подгрузить процедуры и переменные из другого файла, надо сделать так

файл mover.rules

Код

$select_qwe='(?i)^qwe';

sub run1 {
  print "run1\n";
}



основной файл

Код

#!/usr/bin/perl
use strict;
use warnings;
### зачитывание из внешнего файла
my $file="mover_cron.rules";
unless (my $return = do $file) 
{
        warn "couldn't parse $file: $@" if $@;
        warn "couldn't do $file: $!"    unless defined $return;
        warn "couldn't run $file"       unless $return;
}

### работа

run1();

no strict ;
print $select_qwe;


если запустить то выводит
Код

D:\perl\mover>perl mover.pl
Name "main::select_qwe" used only once: possible typo at mover.pl line 20.
run1
(?i)^qwe



Это сообщение отредактировал(а) ramus - 24.4.2008, 18:41
PM MAIL   Вверх
amg
Дата 26.4.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(ramus @  23.4.2008,  22:36 Найти цитируемый пост)
в кэмелбук таких примеров я не нашел...скорее плохо искал
Описание того, как вставлять различные логические условия в регулярное выражение, есть, например, в Perl Cookbook (с. 254 в переводе 2-го издания). Но пользоваться этим нужно лишь в исключительных случаях. Даже элементарное /a|b/ лучше заменять на /a/ || /b/ - как правило, быстрее будет работать, а для более сложных случаев (типа того, что ниже) - будет еще и гораздо понятнее.
Цитата(ramus @  23.4.2008,  22:36 Найти цитируемый пост)
Правильно я понял, что в регулярном выражении
$select_APL_LOG = '(?!.*\.in_progress$)^(?i:[REGW])(?:001000|10[013])';
?! - отрицание
?: - не захватывать () в $1  ?
но вот сами три шаблона в скобках как работают не понятно
(?smile - действительно группировка без захвата. Такая группировка немного быстрее и не имеет побочных эффектов (предыдущая $1 не страдает).
(?!) - не просто отрицание, а "отрицательное" заглядывание вперед.
Приведенное регулярное выражение пробегает по всем символам строки и смотрит, во-первых, чтобы строка начиналась на (?i:[REGW])(?:001000|10[013] и, во-вторых, чтобы перед каждым символом не было подстроки, оканчивающейся на \.in_progress. Понятно, что пока конец строки не достигнут, второе условие будет выполняться. Но когда встали на конец строки, тут то и появляется возможность определить, есть ли перед ним "подстрока, оканчивающаяся на \.in_progress".

Естественно, такую извращенную логику я не сам придумал и реализовал - подсмотрел в Perl Cookbook smile 



PM MAIL   Вверх
ramus
Дата 26.4.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Цитата
 Даже элементарное /a|b/ лучше заменять на /a/ || /b/ - как правило, быстрее будет работать, 

Значит предложение tolkien (разбивать на несколько логических правил и последовательно выполнить каждое рег выражение)  для данного случая подходит лучше. 
Кстати 
Цитата
 надо придумать свой разделитель между разными рег. выраж.  
 позволит закодировать и логику (И ИЛИ)
например
для двух правил по И 
select_CU=^[cCuU]#AND#/\.n_progress$/
для двух правил по ИЛИ
select_CU=^[cCuU]#OR#/\.n_progress$/

но только как бы не нарваться на совпадение с самим шаблоном и необходимо придумать правило с приоритетами ( например в каком порядке выполнять 1 AND 2 OR 3 )? в общем направление решения мне понятно, буду реализовывать 

спасибо за разъяснения по RE

за ссылку спасибо, почитаю
PM MAIL   Вверх
arto
Дата 26.4.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



Цитата(amg @  26.4.2008,  11:20 Найти цитируемый пост)
Даже элементарное /a|b/ лучше заменять на /a/ || /b/ - как правило, быстрее будет работать


а циферки привести можно?

а то у меня:

# perl -MBenchmark=timethese -de0
DB<1> @a = map { join "",map { qw(a b)[int rand 2] } 3..int(rand 10) } 1..102400
DB<2> timethese (10_000,{ 'A' => sub { my $a; foreach (@a) { $a += m#^a|^b# } return $a },'B' => sub {  my $a; foreach (@a) { $a += m#^(?:a|b)# } return $a },'C' => sub { my $a; foreach (@a) { $a += m#^a# || m#^b# } return $a; } })
Benchmark: timing 10000 iterations of A, B, C...
         A: 705 wallclock secs (658.01 usr +  4.76 sys = 662.77 CPU) @ 15.09/s (n=10000)
         B: 683 wallclock secs (638.36 usr +  4.50 sys = 642.86 CPU) @ 15.56/s (n=10000)
         C: 795 wallclock secs (739.54 usr +  5.09 sys = 744.63 CPU) @ 13.43/s (n=10000)

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(ramus @  26.4.2008,  12:08 Найти цитируемый пост)
надо придумать свой разделитель между разными рег. выраж.
Я не очень понял, зачем это надо. Почему это не может быть нативный перловский код?

mover.rules:
Код
# В кавычках - любой код perl, тестируюший строку, находящуюся в $_
$select_CU = '/^(?i:[CU])/ && ! /\.in_progress$/';

# В кавычках - любой код perl, принимающий строку, находящуюся в $_
# и возвращающий модифицированную строку
$modify_uc = 'uc';

1

скрипт:
Код
use strict;
use warnings;
require "./mover.rules";

my $filename = 'c.txt';
my $select_rule = 'select_CU';
my $modify_rule = 'modify_uc';

print "OK\n" if test($filename,$select_rule);
print modify($filename,$modify_rule), "\n";

sub test {
  no strict 'refs';
  return eval "local \$_= q($_[0]); ${$_[1]}";
}

sub modify {
  no strict 'refs';
  return eval "local \$_= q($_[0]); \$_ = ${$_[1]}";
}



PM MAIL   Вверх
amg
Дата 28.4.2008, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(arto @  26.4.2008,  16:56 Найти цитируемый пост)
а циферки привести можно?
Пожалуйста.
Код
@a = map { join '', (map {rand 1e15} 1..100), qw(a b)[rand 2] } 1..100;

use Benchmark qw(timethese);
timethese (1e3,{ 
'A' => sub { my $a; foreach (@a) { $a += m/a|b/ } return $a },
'B' => sub { my $a; foreach (@a) { $a += m/(?:a|b)/ } return $a },
'C' => sub { my $a; foreach (@a) { $a += m/a/ || m/b/ } return $a },
})

Код
Benchmark: timing 1000 iterations of A, B, C...
         A: 26 wallclock secs (25.74 usr +  0.03 sys = 25.77 CPU) @ 38.80/s (n=1000)
         B: 26 wallclock secs (25.80 usr +  0.01 sys = 25.81 CPU) @ 38.74/s (n=1000)
         C:  2 wallclock secs ( 1.56 usr +  0.00 sys =  1.56 CPU) @ 641.03/s (n=1000)

arto, просто Вы обнаружили тот самый случай, который не подпадает под оговорку "как правило". У Вас регулярное выражение способно уже на первом символе строки решить, "Да" или "Нет". В моем же случае для этого решения ему нужно просмотреть всю весьма длинную строку до конца. Думаю, в моем случае результат сравнения будет совсем катастофическим, если для большого количества моделей воспользоваться приемом, который многие любят использовать:
Код
$full_pattern = join '|', @patterns;
if (/$full_pattern/) ...
Прежде всего, именно от этого отцы-основатели предостерегают...
PM MAIL   Вверх
ramus
Дата 28.4.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Цитата

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

 smile  Да, размышляя как реализовать парсер всего этого (на даче на выходных) я тоже до этого дошел smile
 
И пример красивый привели. Действительно перловый стиль. А я все шеллом мыслю :(

С правилами отбора все ясно и просто
Теперь думаю все ли случаи позволит реализовать предложенный Вами подход в "actions":

Цитата

# В кавычках - любой код perl, принимающий строку, находящуюся в $_
# и возвращающий модифицированную строку
$modify_uc = 'uc';


так как реально actions бывают весьма извращенны smile
например такие два примера actions на шелле

Код

check_exists_send_suspended () {
  if [ -f "${DIR_OUT}/${FILE_OUT}" ] ; then
    #remove  pending
    DIR_OUT=`dirname ${DIR_OUT}`
    # add suspended
    DIR_OUT=`echo ${DIR_OUT}/${SUS}`
    i=1
    NAME2MV=`echo ${FILE_OUT}.${i}`
    while [ -f "${DIR_OUT}/${NAME2MV}" ] ; do
      i=`expr ${i} + 1`
      NAME2MV=`echo ${FILE_OUT}.${i}`
    done
    FILE_OUT=${NAME2MV}
    write_log ". check_exists_send_suspended: Send to SUSPENDED = ${DIR_OUT}/${FILE_OUT}"
  fi
}

check_correct_YS_send_susp () {
  IS_OSTATOK=`echo "${FILE_OUT}" | grep -c -ie ^Y -ie ^S`
  if [ "${IS_OSTATOK}" -gt 0 ] ; then
    SEND2SUS=0

    # IF [YS]xxxxxxxx.jjj <> $JJJ
    EXT_YSfile=`echo "${FILE_OUT}" | cut -d '.' -f 2 | awk '{printf "%03d",$1}'`
    if [ "${EXT_YSfile}" != "${JJJ}" ] ; then
      SEND2SUS=1
    fi

    # if time > 23:30
    TIME_HHMM=`date +'%H%M'`
    if [ "${TIME_HHMM}" -ge 2330 ] ; then
      SEND2SUS=2
    fi

    if [ "${SEND2SUS}" -ne 0 ] ; then
      #remove  pending
      DIR_OUT=`dirname ${DIR_OUT}`
      # add suspended
      DIR_OUT=`echo ${DIR_OUT}/${SUS}`
      i=0
      NAME2MV=`echo ${FILE_OUT}.NO_TIME`
      while [ -f "${DIR_OUT}/${NAME2MV}" ] ; do
        i=`expr ${i} + 1`
        NAME2MV=`echo ${FILE_OUT}.NO_TIME.${i}`
      done
      FILE_OUT=${NAME2MV}
      write_log ". check_correct_YS_send_susp: Send to SUSPENDED(${SEND2SUS}) = ${DIR_OUT}/${FILE_OUT}"
    fi
  fi
}


требуемая бизнес логика бывает весьма извращенна  smile 
PM MAIL   Вверх
ramus
Дата 3.5.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Блин  smile опять уперся

есть файл правил (file_rules). В нем могут определяться абсолютно любые (отвечающие синтаксису перла) переменные и процедуры. ВАЖНО: Их имена в основной проге заранее неизвестны. Например:
Код

$YYMMDD = sprintf "%02d%02d%02d",sub{(substr($_[5]+1900,2,2),$_[4]+1, $_[3])}->(localtime);
$disk_T="/iofiles";
$select_BAR_001030='$_ =~ m(^.001030)i && $_ !~ m(\.in_progress$)i';

sub add_iss {
  my $name=$_;
  return "iss_" . $name ;
}

Он зачитывается из основной проги как 
Код
 require ${file_rules}; 


Есть конфигурационный файл, в котором эти переменные и процедуры могут использоваться. Например
Код

CP $disk_T/path/${YYMMDD}   $disk_T/exchange/${YYMMDD}/package ${select_BAR_001030} add_iss


надо: из проги на перле, зачитав из конфигурационного файла строку, правильно ее разобрать. Например в данном случае
строка:
Код
 $disk_T/path/${YYMMDD} 

должна быть оттранслирована в (если дата запуска проги 3 мая 2008)
Код
 /iofiles/path/080503 


пытаюсь сделать через eval 
Код

   # в $inp_line прочитанная строка из конфигурационного файла 
   ($cmd, $dir_src, $dir_dst, $filter, @actions) = split(/\s/,$inp_line);    

   $dir_src = eval $dir_src;
   if ($@) {die "Error: while eval=$dir_src - $@"};
 ругается, что 
Error: while eval= - Illegal division by zero at (eval 4) line 1.

тогда пытаюсь так (через выполнение регулярки /e )
Код

   $dir_src =~ s{(\$\{?\w+\}?)}{$1}eeg ;


ругается что 
Код

Variable "$disk_T" is not imported at (eval 12) line 2.
Use of uninitialized value in substitution iterator at create_mail4bank2.pl line 295.
Variable "$YYMMDD" is not imported at (eval 13) line 2.
Use of uninitialized value in substitution iterator at create_mail4bank2.pl line 295.


а я не могу написать в основной проге our $disk_T, так как я формально до ее запуска не знаю какие переменные навставляют в file_rules.


Что сделать - ума не приложу
не хотелось бы весь файл правил построчно проверять на наличие переменных и делать "our переменная", так как тогда надо разбирать что переменная объявляется не внутри процедур, а  это совсем другое решение :(
сделать два отдельных файла правил - для процедур и для переменных что то не хочется


PM MAIL   Вверх
ramus
Дата 3.5.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Вроде разобрался. Перед строкой 

 
Код

   $dir_src =~ s{(\$\{?\w+\}?)}{$1}eeg ;


надо дать

Код

    my $wrk=$dir_src;
    while ($wrk =~ m{(\$\{?\w+\}?)}g) {
      write_log (" do: our $1\n") if $debug>2;
      our $1 ;
    }

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(ramus @  3.5.2008,  20:00 Найти цитируемый пост)
пытаюсь сделать через eval 

А так?
Код
$dir_src = eval "qq($dir_src)";

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


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

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


 




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


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

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