#регулярные_выражения #perl
К примеру есть такой кусок: TEXT_TO_REPLACE как мне сделать замену TEXT_TO_REPLACE с поиском по VARIABLE?
Ответы
Ответ 1
Ответ из комментариев от @Andrzej A. Filip $string =~ s/(\).*?(\<\/param\>)/\1$newtext\2/gis;
#регулярные_выражения #perl
К примеру есть такой кусок: TEXT_TO_REPLACE как мне сделать замену TEXT_TO_REPLACE с поиском по VARIABLE?
Ответ 1
Ответ из комментариев от @Andrzej A. Filip $string =~ s/(\).*?(\<\/param\>)/\1$newtext\2/gis;
#регулярные_выражения #perl
Задание: есть текст, допустим abc/*de/*f*/m*/x с комментариями, которые нужно удалить регулярным выражением, причем, если в комментарии есть вложенный комментарий, то сначала надо удалить его. У меня получилось что-то такое: while ($string =~ m|/\*(.*?)\*/|) { $string =~ s|(/\*((?!(.*?/\*).*?).*?)\*/.*?)|$_|; print ""$string\n; } Получим: abc/*de/*f*/m*/x abc/*dem*/x abcx И все вроде работает хорошо, но если в примере будут идти два комментария подряд, допустим теперь строка abc/*de/*f*/*/x, то программа зациклится. Подскажите, как можно решить эту проблему.
Ответ 1
$string="abc/*def/*gh/*j*/ik*/lmn*/opq/*r/*st*/uvw*/xyz"; print "$string\n\n"; while($string=~m|/\*.*?\*/|) { # До тех пор пока комментарии остались $string=~s|/\*((?!.*?(?0)).*?)\*/||; # Вырезаем один print "$string\n"; } Результат: abc/*def/*gh/*j*/ik*/lmn*/opq/*r/*st*/uvw*/xyz abc/*def/*gh/*j*/ik*/lmn*/opq/*ruvw*/xyz abc/*def/*gh/*j*/ik*/lmn*/opqxyz abc/*def/*ghik*/lmn*/opqxyz abc/*deflmn*/opqxyz abcopqxyz Смысл вырезающей регулярки: /\* # Комментарий открылся ( # Выделяющая группа (?!.*?(?0)) # Внутри которой не содержится еще одно выражение .*? ) \*/ # Комментарий закрылся Основа в ссылке (?0), которая на свое место подставляет текст всего выражения целиком, рекурсивно.
#perl
use lib '/full/path/to'; require 'script.pl';
Ответ 1
use lib "simplifies the manipulation of @INC at compile time.", в частности, в данном случае, добавляет /full/path/to к @INC (список путей, в которых ищутся библиотеки). Поэтому в дальнейшем, чтобы подключить /full/path/to/script.pl, достаточно указать только имя script.pl, без полного пути. require — директива, среди прочего, и для подключения библиотек без импорта их символов.
#php #imagemagick #javascript #perl
Можно использовать: php, perl, imagemagick, gd, shell Нельзя использовать: Сторонние библиотеки и программы. Нужна именно суть реализации подобного. Задача: Сделать скриншот урла по нажатию на кнопку в браузере. Пример: Как обустроить frontend я знаю и с этим проблем никаких нет. Вопрос как можно указанными средствами сделать скриншот с урла. Идеи вроде поставить vm не подходят, нужно делать все моментально, запрос ушел - ответ пришел, без особых задержек. Идеи гугла: Через shell, используя firefox bash: firefox URL scrot -d 5 OUT.png Недостатки: если на сервере нет x-ов или прав у юзера нет, то все обломается Через IE COM Реализацию можно найти на хабре или воспользоваться php.net Недостатки: только под винды, а нужно под линух Надеюсь, что решение есть, просто я не умею использовать гугл :)
Ответ 1
Не пойму я, как это вы хотите обойтись без «сторонних библиотек и программ» — самому полностью писать рендерную машину? Но раз ImageMagick вам не сторонний, то полагаю, и webkit-qt тоже сойдет :) Если все-таки есть иксы и можно использовать браузер, то лучше коннектиться к файрфоксу через MozRepl. Если хочется обойтись без иксов (точнее, без рисования на экране), то можно задействовать xvfb или vncserver. Если хочется обойтись без целого браузера, то можно брать какой-нибудь headless движок: phantomjs, watin, htmlunit Вот вам пример для ориентировки: CutyCapt. Удачи.
#perl #shell #sed #linux
Вопрос в заголовке. Только не все строки. Про tr -d '\n' мне известно. Пример: abc ; fgh ; " qwe rty " ; " asd " ; end В конвейере нужно превратить в: abc;fgh;"qwe rty";"asd";end\r Другими словами, сделать нормальный CSV из вывода, где поля в отдельных строках, разделитель полей ';' тоже в отдельной строке и поля, которые могут содержать \n, обрамлены строками '"'. Последний \n надо заменить на \r\n Для программы (на Си?) я бы сформулировал задачу просто: убрать все \n вне "...", а внутри "..." убрать первый сразу за '"'. (на Си писать не надо, если "однострочник" не получится, то на нем сам как-нибудь напишу). ... Пока замер на проблеме, что я никак не могу заставить работать что-нибудь типа s/\n;\n/;/ ни в sed, ни в perl (т.е. работать с выражением для 2-х строк) P.S. python 2.4 тоже подойдет.
Ответ 1
perl -0777 -lpe 'BEGIN{$\="\r\n"}s#\n;\n#;#gsm;s#;"\n#;"#gsm'
#perl
Для предисловия делаем тестовый код, который переводит строку в верхний регистр, немного комбинируя способы вызова и возврата из функций: #!/usr/bin/perl $str="Abc"; $s1=a($str); $s2=b(a($str)); $s3=c($str); $s4=b(c($str)); print "str=$str; a()=$s1; b(a())=$s2; c()=$s3; b(c())=$s4\n"; sub b { return $_[0]; } sub a { my($tmp)=$_[0]; return uc($tmp); } sub c { my($tmp)=$_[0]; return $tmp=uc($tmp); } Результат работы абсолютно предсказуемый: str=abc; a()=ABC; b(a())=ABC; c()=ABC; b(c())=ABC А теперь абсолютно то же самое сделаем, что бы развернуть строку задом наперед, используя функцию reverse вместо uc: #!/usr/bin/perl $str="Abc"; $s1=a($str); $s2=b(a($str)); $s3=c($str); $s4=b(c($str)); print "str=$str; a()=$s1; b(a())=$s2; c()=$s3; b(c())=$s4\n"; sub b { return $_[0]; } sub a { my($tmp)=$_[0]; return reverse($tmp); } sub c { my($tmp)=$_[0]; return $tmp=reverse($tmp); } И тут мы получаем абсолютно неожиданный результат: str=Abc; a()=cbA; b(a())=Abc; c()=cbA; b(c())=cbA При передаче результата работы функции a, как параметра, в функцию b (которая просто возвращает полученное значение) на выходе мы получаем не перевернутую строку. При этом, практически идентичная функция c ведет себя так, как и было задумано. Собственно вот это присваивание $tmp=reverse($tmp) при return я придумал, когда боролся с неожиданным поведением с возвратом после reverse. Когда первый раз увидел это, ставил печать в функцию b, у нее на входе именно такое значение как она и возвращает и которое собственно напечатано в результате. UPD: Проверил print b(reverse($str)); возвращает Abc !!! Добавлю, что такой результат на Perl v5.12.4, на других версиях не проверял. Вопрос: почему при возврате значения которое вернула reverse в случае прямого его использования поведение ожидаемое, а при передаче этого значения как параметра в другую функцию результат такой, как будто никакого reverse не было выполнено ? Глюк это или фича ?
Ответ 1
Результат абсолютно ожидаемый и предсказуемый. Функция reverse работает по разному в скалярном и списочном контексте. В списочном контексте она разворачивает список, в скалярном - строку. А теперь вопрос. Если у нас есть список с одной строки, то что вернет для него reverse? Естественно, саму строку. При вызове b(a()) перл пытается понять контекст. Функция b возвращает просто свой первый аргумент, а получает на вход - список (она же функция, а аргументы у нее не были специфицированы). Поэтому, функция a должна возвращать список. Отсюда, return возвращает список. А это значит, что контест списочный. В списочном контексте аргумент считается списком и естественно строка стает списком с одним элементом. В функции c подобного не происходит - там явно виден скалярный контекст. P.S. код ужасен. Не пишите так. Как минимум используйте use strict; use warnings и my.
#perl #ssh #распараллеливание
#!/usr/bin/perl use threads; use Net::SSH::Perl; sub thread_routine { if ($i<=9) { $server = 's0'. $i; } else { $server = 's'. $i; } printf ( "Подключаемся к $server\n"); my $ssh = Net::SSH::Perl ->new($server); $ssh->login("user", "xxx"); $cmd = 'df -k'; my ($out, $err, $exit) = $ssh->cmd($cmd); print ( "$out"); return $i; } foreach $i (1..10) { push @threads,threads->create('thread_routine',$i); } foreach $thread (@threads) { $thread->join(); } Подключаемся к s01 Подключаемся к s02 Подключаемся к s03 Подключаемся к s04 ... Подключаемся к s10 Ошибка сегментирования (сделан дамп памяти)
Ответ 1
Переписала код, теперь хосты берутся из файла. Вместо модуля threads использую Parallel::ForkManager. Работает, ошибки сегментации не возникает #!/usr/bin/perl -w use strict; use Parallel::ForkManager; use Net::SSH::Perl; my $max_procs = 3; my @hosts; my $timeout = 30; my $input = shift; die "Usage: $0 FILE\n" if ! $input; open (INPUT, $input) || die "Can't read '$input': $!\n"; while () { chomp ($_); my $line = $_; push @hosts, $line; } close INPUT; my $pm = new Parallel::ForkManager($max_procs); foreach my $host (@hosts) { my $pid = $pm->start() and next; print "$host \n"; my $ssh = Net::SSH::Perl ->new("$host"); $ssh->login("user", "xxx"); my $cmd = 'w'; my($out, $err, $exit) = $ssh->cmd($cmd); print "$out \n"; $pm->finish; } $pm->wait_all_children;
#регулярные_выражения #perl
Есть ли возможность вернуть из Perl exit code отличный от 0, если не произошло замены текста, когда Perl работает в режиме sed с опциями -pe? В этом примере хотелось бы вернуть не ноль, для дальнейшего code workflow в SHELL скрипте: echo "xxx xxx" | perl -pe 's/yyy/zzz/'
Ответ 1
Оператор замены возвращает количество произведенных замен, поэтому мы можем посчитать их в переменной. Это происходит в скрытом цикле, который добавляет ключ -p, поэтому сразу вернуть это количество не получится. Мы можем перехватить момент завершения программы создав блок END, в котором можно менять код завершения программы, находящийся в $?. echo "xxx xxx" | perl -pe '$c+=s/yyy/zzz/; END { $?=$c }' && echo "No replacement" Данный пример выведет "No replacement", так как замены не произошли.
#регулярные_выражения #perl
Для того что б вырезать все пробелы и переводы строк, как с начала, так и с конца, + убирать двойные пробелы, написал регулярку: $opis =~ s/^\s+|^(\r?\n)+|\s+$|(\r?\n)+$//g; $opis =~ s/\s+/ /g; Локально все работает, как только запускаю на сервере, работать не хочет. Вернее оно удаляет вообще все переводы строк, даже те, что есть в середине текста. Почему?
Ответ 1
\s в регулярном выражении означает и перевод каретки в том числе, поэтому в середине строки исчезают переводы. используйте \h $opis =~ s/^\s+|\s+$//g; $opis =~ s/\h+/ /g;Ответ 2
Потому что g в конце поставил. Рекомендую начальные/конечные пробелы убирать одной регуляркой (или двумя), а двойные переводы строк другой, уже с g.Ответ 3
$opis=~s/\s{2,}|\n//g
#perl #datetime
Чтобы определить номер текущей недели в php достаточно одной строчки date("W", time()); Как сделать тоже самое на перле? Нашел только пару примеров на несколько строк. Неужели нельзя как-то проще.
Ответ 1
perl -MTime::Piece -E '$t = localtime; say $t->week' 3Ответ 2
можно воспользоваться функцией strftime() из пакета POSIX. параметры и результат — те же: $ perl -e 'use POSIX qw(strftime); print strftime "%W", localtime;' 03
#массивы #perl
my $poly = [ [0,0], [0,2], [2,2], [2,0] ]; это что то типа ссылки на анонимный массив массивов? мне нужно добавить не четыре подмассива из двух элементов, а, например, 1000, как это можно сделать? я бы сгенерировал через eval строку. но это как то извращенно. может както можно по другому? И как распечатать такого типа массив? спасибо!
Ответ 1
my $poly = [ [0,0], [0,2], [2,2], [2,0] ]; # ссылка на пустой массив $poly =[]; # Можно так, если массив можно собрать тут же: push @{$poly}, [3,0]; # Или так, если массив где то еще: my @arr=(3,0); push @{$poly}, \@arr; # Или так $poly->[4]=[3,0]; # Ну и скажем обращение к элементу вложенного массива print $poly->[1]->[1]; # 2 Не знаю в каком виде вы бы хотели его напечатать, вот так его можно обходить, углубляясь в структуру: for( @{$poly} ) { for( @{$_} ) { print; } }Ответ 2
Обычный массив создаётся в скобках (1,2,3), а это ссылка на массив [1,2,3]. Получается в вашем случае имеем ссылку на массив из ссылок на массивы [[1,2],[3,4]], такое в перле используется тоже часто. Вывести можно его с помощью Data::Dumper (который может кстати вывести произвольную по вложенности сложную структуру), также можно вручную. Добавлять элемент как и в обычный массив push @$poly, [1,2], но при этом нужно разыменовывать ссылку (дополнительный @ в начале), либо можно разыменовывать через стрелку $poly->[0] (где 0 это индекс). Вот код (запустить онлайн): use Data::Dumper; # Создаём массив вручную my $poly = [ [0,0], [0,2], [2,2], [2,0] ]; # Выводим через Dumper print Dumper($poly); # Заполняем массив в цикле $poly = []; for $i (0..9) { push @$poly, [$i, $i + 1]; } # Выводим через Dumper print Dumper($poly); # Выводим массив вручную for $i (0..scalar(@$poly) - 1) { print "[", $poly->[$i]->[0], ",", $poly->[$i]->[1], "] "; } print "\n"; # Также можно вывести весь массив таким навороченным синтаксисом print "[" . join(", ", map { "[" . join(", ", @$_) . "]" } @$poly) . "]\n";
#sql #ассемблер #javascript #php #perl
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются. Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском». Закрыт 4 года назад. Приветствую товарищи IT-шники. Немогли бы вы накидать в виде тематика/автор/название книги-учебники по SQL,php,perl,javascript, ну и по ассемблеру. Причина по которой я не иду гуглить учебники в том что гугл не разделяет их на стоящие от пустышек. Я не начинаю учить это с нуля, просто мне интересно прочитать рекомендуемые учебники, если я их уже не прочитал. Заранее спасибо. А еще такой вопрос: Какой вы посоветуете софт использовать при освоении данных книг?
Ответ 1
SQL SQL запросы для простых смертных (Майкл Дж. Хернандес, Джон Л. Вьескас) и SQL сборник рецептов (Энтони Молинаро) еще читал "Изучаем SQL" (Алан Бьюли), но мне эта книга показалась совсем для начинающих. PHP Если уже знакомы с PHP, то можно выборочно посмотреть в "Профессиональное программирование на PHP" (Джордж Шлосснейгл) и конечно же стоит почитать про ООП в PHP PHP. Объекты, шаблоны и методики программирования. (Зандстра Мэтт), сейчас уже есть 3-е печатное издание, но не слишком отличается от 2-го, которое можно найти в сети.Ответ 2
Perl 1) Изучаем Perl (5-ое издание на русском. Правда сейчас уже есть и 6-ое издание, пока только на английском). 2) Изучаем Perl глубже 3) Modern Perl (новая книга, только английском, в электронном виде - предоставляется бесплатно) 4) Программирование на Perl Первые две - для новичков. Третью - лучше попозже прочитать. Четвертая - подробное руководство от создателя языка, там высвечиваются очень важные моменты, немного устарела, но уже готово следующее издание, в продажу выйдет осенью.Ответ 3
Perl Мне нравится вот эта подборка книг правда вся на английском: Harvey M.Deitel / How to Program in Perl Randal L. Schwartz, brian d foy, Tom Phoenix / Learning Perl 6th Edition Chromantic / Modern Perl Brian d foy / Mastering Perl Damian Conway / Perl Best Practices Также смотри на издание Oreilly очень хорошее: oreilly.com/perlОтвет 4
Интерактивный учебник по SQL. Никакой дополнительный софт не нужен. Запросы к СУБД (SELECT) можно писать непосредственно в учебнике.Ответ 5
по PHP после учебников тебе сюда частенько прийдеться заглядывать http://ru2.php.net/ так же, читай паттерны программирования... примеры книг не приведу ибо в сети всю необходимую информацию можно найти писать кому в чем удобно, лично я работаю на Zend Studio 8Ответ 6
Лично я очень уважаю эту книгу по Perl. Не хочу навязывать свое мнение, но Beginning Perl (Wrox) обязательна, на мой взгляд, к прочтению.Ответ 7
Литература по которой я в свое время изучал: Java: 1) Самоучитель Java Script - Вадим Дунаев (2 издания) 2) Java Script: Наглядный курс создания динамических WEB-страниц - Келли Л. Мэрдок 3) Java Script: Библия пользователя (5ое издание) - Денни Гудман, Майкл Моррисон 4) ВВЕДЕНИЕ В JAVASCRIPT - Стефан Кох 5) Java - Патрик Ноутон PHP 1) Самоучитель.PHP - Д.Котеров 2) PHP 5 "Для чайников" - Джанет Валейд 3) PHP/MySQL для начинающих - Энди Харрис 4) PHP 5 в подлиннике - Дмитрий Котеров, Алексей Костарев 5) PHP уроки - Евгений Попов (сайт http://ruseller.com/) Всего понемногу: Креативный WEB-дизайн - Крис Джамса, Кондрат Кинг, Энди Андерсон Самоучитель создание WEB-страниц и сайтов - Печников В.Н. Вообще лучшим учебником является Google =)
#perl
Доброго времени суток! Хотелось бы узнать стоит ли изучать Perl. Каковы его функциональные возможности, применение и назначение?
Ответ 1
http://ru.wikipedia.org/wiki/Perl По мне, так это очень удобный и простой язык. Мой любимый )))Ответ 2
В настоящее время широко используется для обработки больших объемов текстовой информации, собственно для чего и был создан. Это и определяет сферу его популярности. Кроме всего прочего, туда входит такая серьезная наука как биоинформатика - наука об анализе последовательностей нуклеиновых кислот и пептидов.Ответ 3
Perl - это "мощный, гибкий, безопасный и современный" язык высокого уровня, который используется в самых различных областях - от парсинга текстовой информации до разработки графических и мультимедиа-приложений. Отлично справляется с обработкой различного типа данных, поэтому часто используется при написании различного вида парсеров и ботов. Может использоваться для задач системного администрирования. Одной из современных "ниш" для языка Perl стала веб-разработка. На нём написано немало веб-фреймворков - как микрофреймворков, так и полнофункциональных MVC-фреймворков. Многие компании разрабатывают свои движки на языке Perl - это регистраторы доменных имён и хостинг-провайдеры, поисковые системы, SEO-компании, медиакомпании, разработчики онлайн-игр и т.д. В последние годы язык Perl переживает свой "ренессанс", своего рода возрождение - очень многое было доработано как в самом языке (к примеру, появилась наиболее полная из всех языков поддержка Unicode), так и в сторонних модулях: написаны фреймворки для эффективной объектно-ориентированной разработки, асинхронного программирования, удобные ORM, и многое, многое другое. Как выразился недавно один комментатор блога о Perl:"This is not your Daddy's Perl" - "Это не тот Perl, на котором программировал твой папочка" :) Это Modern Perl. У языка Perl довольно активное комьюнити, которое поддерживает и развивает его. Ежегодно по всему миру проводятся десятки конференций YAPC (Yet Another Perl Conference), воркшопов и технических, а также нетехнических встреч, посвящённых Perl - в том числе и в России (зачастую с участием заграничных гостей). Участие в таких мероприятиях как правило бесплатное. Кстати, одна из таких конференций будет проводиться совсем скоро, 12-13 мая, в Киеве. Если есть время, возможность и интерес к языку Perl, весьма рекомендую прийти послушать доклады и пообщаться с людьми, использующими этот язык в повседневной жизни. Участие в конференции бесплатное, нужно только зарегистрироваться и подать заявку на участие на сайте конференции.Ответ 4
Perl даёт всё, что бы писать изящный и выразительный код. Мультипарадигменный, модифицируемый, подстраиваемый под любую модель разработки. P.S. и конечно же не стоит забывать, что у хороших perl программистов всегда будет интересная и высокооплачиваемая работа.Ответ 5
В последнее время Perl очень бурно развивается. Появились очень качественные веб-фреймворки, такие как Mojolicious, Dancer. Появился полностью асинхронный веб-фреймворк Tatsumaki, который по производительности может поспорить с Node.js. Так что для разработки веб-приложений Perl подходит как нельзя лучше. А если учесть, что В Perl есть одна из самых лучших систем тестирования, то разработка методом TDD ( Test Driven Development ) становится одним сплошным удовольствием, и программы получаются очень качественные. Perl - это умный язык. Его разрабатывал лингвист по профессии. Поэтому Perl - это набор базовых кирпичиков, из которых можно построить красивое здание Вашего веб-проекта. Любые готовые части здания можно найти на CPAN или новом поисковике METACPAN. Это позволяет построить здание веб-проекта с максимально высокой скоростью. В общем, выбирая язык программирования Perl, Вы однозначно выигрываете.Ответ 6
Perl весьма лаконичный, живой, изящный и одновременно CPAN-термоядерный. В нём сочетаются разные традиции и нет осуждения. Он даёт спокойствие и находит гармонию. Остальные --- блеклая тень и суета.Ответ 7
Перл позволяет сфокусироваться на проблеме, а не на ее реализации, работает везде, никогда не ломал обратную совместимость и не собирается. Очень хороший язык для новичков: можно писать полноценные работающие программы с первого дня и изучать новые функции постепенно. Пример: my $name = "World"; if ($name eq 'World') { print "Hello, $name\n"; } else { print "Bye, $name\n"; }Ответ 8
На perl легко и быстро написать: бота, паука. систему обработки террабайтов текста и html. окошечное приложение под linux(qt,gtk). web интерфейс(Rose::DB +HTML::Template + fastcgi), который не будет падать от 1000 одновременных соединений. однострочники для повседневых задач(cat access.log|perl -le 'split,$h{$_[0]}++ for <>; $,="\n"; print map{"$_ $h{$_}"} sort{$h{$a}<=>$h{$b}}keys %h'|tail) клиент для любого веб и не только сервиса. и многое другое.Ответ 9
Последний пример я бы переписал так: my $name = 'World'; my $greet = $name eq 'World' ? 'Hello' : 'Bye'; say $greet . ',' . $name; А помимо обработки текста, perl очень хорош для системного программирования под unix like OS. На нем пишутся различные системы мониторинга сетей, оборудования и т.п. И в этой сфере он гораздо более востребованный нежели С/С++, потому что скорость разработки на нем в разы быстрей.Ответ 10
Лучше не начинайте изучать Perl, так как спрос на программистов Perl за предыдущий год упал почти в 2 раза! Точно такая же картина с программистами PHP... Лучше начните изучать Ruby, Ruby на рельсах или Python+Django. Спрос на этих программистов вырос почти в два раза! Несмотря на то, что Perl довольно мощный и гибкий язык, изучить его можно лишь для саморазвития, но не для профессиональной деятельности, так как он постепенно гибнет на глазах. Ему на смену идут совершенно новые решения.
#perl
Поясняю: print "Введите команду:\n"; chomp ($kom = >STDIN>); if ($kom = <условие>) { оператор 1; оператор 2; } else { оператор 3; } И чтобы при выполнении любой ветки ветвления, скрипт продолжал ожидания ввода команды и не дожидаясь завершения первой начинал выполнять условие второй? Спасибо.
Ответ 1
Можно запускать новый процесс для выполнения каждой введённой команды: while () { chomp(); next if $_ eq ''; last if $_ eq 'exit'; fork() and next; # тут обрабатываем введённую команду exit(); } Если по окончании цикла ввода надо дождаться окончания обработки всех введённых команд, можно сделать так: use POSIX ':sys_wait_h'; my %children; while ( ) { chomp(); next if $_ eq ''; last if $_ eq 'exit'; my $pid = fork(); if ($pid) { $children{$pid} = 1; next; } # тут обрабатываем введённую команду exit(); } # ждём окончания всех процессов обработки while (keys(%children)) { for (keys(%children)) { my $ret = waitpid($_, WNOHANG); next unless $ret; delete($children{$_}) if $ret != -1; } } Ответ 2
Почитай здесь: Мини экскурс в AnyEvent - пишем паука use AnyEvent; $| = 1; print "enter your name> "; my $name_ready = AnyEvent->condvar; my $wait_for_input = AnyEvent->io ( fh => \*STDIN, poll => "r", cb => sub { $name_ready->send (scalar) } ); # делаем что нидь еще # теперь ждем и подставляем данные на входе my $name = $name_ready->recv; undef $wait_for_input; # watcher нам больше не нужен print "your name is $name\n"; use AnyEvent; как-то так https://gist.github.com/mishin/6449631 Всё, что вы хотели знать об AnyEvent, но боялись спросить
#python #php #ruby #perl
Здравствуйте. От банка должен приходить ответ об успешной оплате пользователя методом POST на конкретный url нашего сайта. Проблема в том, что у банка не получается отправить данные методом пост на наш сайт в то время как я отправляю данные с со своей машины и все принимается и обрабатывается отлично. Может ли быть это связано с настройками моего хостинга или причина в другом? Отправил вопрос провайдеру думают уже очень давно(тупят, не как не могу вникнуть в мой элементарный вопрос). Банковский админ утверждает что у него выходит при отправке некая ошибка: error: java.lang.NullPointerException. Использую: шаред хостинг, Linux, apache, PHP/Yii framework. В чем может быть дело? Спасибо.
Ответ 1
какой бы не была причина - в любом случае это ошибка нашего любимого Казкоммерцбанка. во-первых, клиент всегда прав во-вторых, это нонсенс - чтобы банк не знал в чем дело. выдавать в эфир "error: java.lang.NullPointerException" и демагогию: "у всех работает, а у вас нет" - показатель сверх непрофессионализма. "NullPointerException" - это не причина, а следствие возникшей ошибки. причина может быть: 1) руки (и мозги) не из того места у программистов ККБ (больше всего к этом склоняюсь) 2) фаервол, либо разрыв связи 3) проблема с сертификатом (eicto более грамотно расписал возможные причины конечно). но в этом случае они должны были озвучивать именно это, а не демагогические нульпоинтерэксепшн. если причина с вашей стороны, то должны были выдать инструкции как это исправить. в-третьих, POST он и в Казахстане POST, провайдеры тут не при чем. и тупят не провайдеры, а сотрудники банка. в-четвертых, не удивляйтесь ничему - это Казахстан, родственные связи и т.д.
#perl #функции #sub
Как в функцию передать массив и что то с ним сделать в perl?
Ответ 1
Можно передавать указатель на массив: #!perl.exe -w use strict; use utf8; our @array = qw(Мама мыла Вишну); sub printArray{ my ($ref) = @_; for my $element (@$ref) { print "$element\n"; } } printArray(\@array); См. perldoc perlrefОтвет 2
Пока гуглил или пытался воспроизвести проблему с бесконечным циклом(и конкретной загрузкой ЦП), или отказом вообще работать. нашел решение проблемы. Ниже пример как в пользовательскую функцию передать массив. И в данном случае его вывести. #!perl.exe -w #строка выше у вас может быть другой. use strict; my @array = ("Мама", "мыла", "Вишну"); sub readArray{ my($val) = @_; for(my $i=0; $i < @$val ;$i++){ print @$val[$i]."\n"; } } readArray( \@array); Суть в этом "$@" это называется применить к ссылке операцию разименовывания. А при вызове нужно передать ссылку на массив. информацию нашел тут: http://valera.asf.ru/perl/book/9/9.4.htmlОтвет 3
@a = [1,2,3,4,5,6,7] sub a { $in = shift; foreach ( @{$in} ) { print $_; } }
#encoding #perl
Есть строка $str в неизвестной кодировке. Как вывести на экран эту самую кодировку?
Ответ 1
Кажется, так: use Encode::Detect::Detector; my $encoding_name = Encode::Detect::Detector::detect($str); print $encoding_name;
#linux #регулярные_выражения #perl #sed
Как убрать весь многострочный текст между тэгами описания?Туалетная вода-спрей <br>ВОСТОЧНЫЙ ФУЖЕР <br>Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты, наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи, роскошную жизнь и выражает себя в классическом пок$ <br>Ключевые слова: Уверенный, динамичный, мужественный, благородный, элегантный, статусный, успешный Вот этот вариант удаляет только те, которые в одной строке: sed 's#\(\).*\( \)#\1'xxxxx'\2#g' test.xml > test2.xml Александр Баракин предложил вот такой вариант: $ sed '//,/<\/description>/{//!d}' test.xml > test2.xml но текст не удаляется между тэгами в таком примере: Пример
Ответ 1
для данного конкретного случая, например, так: $ sed '//,/<\/description>/{//!d}' test.xml > test2.xml но лучше, действительно, воспользоваться более подходящим инструментом для работы с xml. если вдруг и строки-ограничители требуется убрать, то {//!d} надо заменить просто на d: $ sed '/ /,/<\/description>/d' test.xml > test2.xml дополнение для удаления текста (в той же строке) и после начального тега, и перед конечным, программу для sed, естественно, придётся значительно удлинить: $ sed '/ /,/<\/description>/{//!d;s/\( \).*/\1/;s/.*\(<\/description>\)/\1/}' test.xml > test2.xml поэтому ещё раз напомню, что для обработки xml лучше воспользоваться каким-нибудь более специализированным инструментом.
#perl
Итак, давайте выполним 2 скрипта, и убедимся, что ++$x работает быстрее... Скрипт-1: #!/usr/bin/perl my $x = 0; foreach (1..5_000_000) { $x++; } perl -d:NYTProf test.pl nytprofhtml --open Результат: Скрипт-2: #!/usr/bin/perl my $x = 0; foreach (1..5_000_000) { ++$x; } perl -d:NYTProf test.pl nytprofhtml --open Результат: Вопрос: Почему ++$x работает быстрее, чем $x++?
Ответ 1
++$x работает грубо говоря в два шага: делаем $x + 1; передаем значение. $x++ (присваиваемый) работает сложнее, его обычно нельзя реализовать без промежуточной копии: сохраняем значение $x в $temp; делаем $x + 1; передаем значение $temp. P.S.: Не присваиваемый $x++, в умных компиляторах/интерпретаторах, может не отличается от ++$x. P.P.S.: При сильных оптимизациях еще все зависит от прилегающих операций, и при использовании простых типов разница скорее всего вообще пропадет.
#python #bash #perl #cmd #shell
Именются 2 гигантских текстовых файла. file1.txt (3,6 Гб) содержит только одну колонку (в том числе много дубликатов): 123456 123456 123456 абвгд абвгд 01щенок 01щенок 01щенок 01щенок 01щенок a0125uß a0125uß file2.txt (1,5 ГБ) содержит ту же колонку, но без дубликатов плюс вторую колонку. 123456:artur абвгд:sergey 01щенок:max a0125uß:stasik Задача: сравнить первые колонки в обеих файлах и заменить одинаковые строки в первом файле, строками из второй колонки второго файла, чтобы получилось следующее (дубликаты в первом файле должны остаться): artur artur artur sergey sergey max max max max stasik stasik У меня есть такой код: import io STRFILE1 = 'file1.txt' STRFILE2 = 'file2.txt' STRFILERESULT = 'result.txt' fIN = open(STRFILE1,'r') strContent = fIN.read() fIN.close() with open(STRFILE2,'r') as f: for line in f: mapping = line.split(":",1) strContent = strContent.replace(mapping[0],mapping[1].rstrip("\n")) fOUT = open(STRFILERESULT,'w') fOUT.write(strContent) fOUT.close() но он работает вечно с таким объёмом строк (102.600.000 - файл 1 и 50.000.000 - файл 2). Как можно ускоритъ процесс обработки?
Ответ 1
Если на python, то можно так: def story_key(): with open('te2', 'r') as f2: my_key = {i.split(':')[0]: i.split(':')[1].strip() for i in f2} return my_key all_key = story_key() def read_small(f_object, f_size=1024): while True: data = f_object.read(f_size) if not data: break yield data def f_write(): with open('te1') as f1: with open('te3', 'a') as f3: for i in read_small(f1): a = [all_key[j] + '\n' for j in i.split('\n') if j] f3.write(''.join(a)) f_write()Ответ 2
Как можно ускоритъ процесс обработки? например, можно воспользоваться не языком программирования, а самыми обыкновенными gnu-утилитами join, sort, cut, nl. с большой долей вероятности это будет работать быстрее, нежели манипуляции со «словарями», или, тем более, базой данных (время на создание индекса, скорее всего, значительно превысит время, за которое отработают предлагаемые утилиты). если порядок строк не важен, то замена будет произведена довольно быстро: $ join -t : -o 2.2 <(sort файл1) <(sort файл2) max max max max max artur artur artur stasik stasik sergey sergey если порядок важен, вычислений понадобится значительно больше. что-нибудь в этом духе: $ join -t : -1 2 -o 1.1,2.2 <(nl -n rz -s ':' файл1 | sort -t ':' -k 2) <(sort файл2) | sort -n | cut -d : -f 2 artur artur artur sergey sergey max max max max max stasik stasikОтвет 3
Ваш скрипт медленный потому что вы для каждого уникального значения создаёте 3.6GB строчку заново. Предполагая что все дубликаты подряд идут и порядок уникальных значений одинаковый в обоих файлах, можно читать файл с заменами и писать их в выходной файл столько раз, сколько текущий ключ повторяется в файле с дубликатами: #!/usr/bin/env python from itertools import groupby with open('file1.txt', 'rb') as dups_file, \ open('file2.txt', 'rb') as replacements_file, \ open('result.txt', 'wb') as output_file: groups = groupby(dups_file) for line in replacements_file: key, value = line.split(b':') dupe_key, dupes = next(groups) assert key == dupe_key.rstrip(), (key, dupe_key) for _ in dupes: output_file.write(value) Чтобы сделать код более устойчивым к неправильному вводу, в зависимости от вашей ситуации, добавьте try/except и пропускайте соответствующие строки. Для ожидаемого ввода, код как есть работает. Этот код читает по одной строчке из каждого файла за раз (минимально памяти требует O(1)). Использование 'b' режима предполагает, что текст в файлах закодирован используя одинаковые кодировки.Ответ 4
Я не зря задавал вопрос про упорядоченность повторяющихся данных. Эту мысль подхватил @jfs и прислал практически оптимальное решение с учетом регулярности данных. Добавлю только, что основное время уходит на обработку строки: strContent = strContent.replace(mapping[0],mapping[1].rstrip("\n")) которую вы постоянно держите "в памяти". Чтобы было понятно - сколько примерно времени уходит на "ворочанье" в памяти strContent приведу близкий по смыслу код. Первый пример - почти как у вас - "все в одно": # -*- coding: utf-8 -*- from time import time fw = open('fileDict.txt',"w", buffering=4096, encoding='utf-8') out_text = '' prefix = "key" t_start = time() for i in range(10000000): out_text += prefix+str(i)+":" + str(i)+ '\n' fw.write(out_text) t_end = time() fw.close() print('work_time=', t_end - t_start ) # results: # without buffering in line #4 # 1 000 000 time 27.8 sec # 10 000 000 time 3403.8 sec # with buffering in line #4 # 1 000 000 time 26.8 sec # 10 000 000 time 3350.8 sec второй вариант - запхнем кусочками в список: from time import time fw = open('fileDict.txt',"w",encoding='utf-8') out_text = '' prefix = "key" out_list = [] t_start = time() for i in range(10000000): out_list.append( prefix+str(i)+":" + str(i)+ '\n' ) t_middle = time() for line in out_list: fw.write(line) t_end = time() fw.close() print('work_time=', t_end - t_start, "parsing time:", t_middle-t_start, \ " + writing_time: ", t_end - t_middle ) # results: # 1 000 000 time 2.2 sec # 10 000 000 time 21.8 sec печать для 1 000 000: work_time= 2.2221806049346924 parsing time: 1.2595593929290771 + writing_time: 0.9626212120056152 печать для 10 000 000: work_time= 21.796194791793823 parsing time: 12.18700361251831 + writing_time: 9.609191179275513 Из чего следует, что представление обрабатываемых данных вашим программистом было выбрано не лучшим образом. Действительно разница в обработке как 3340 к 12 ... на построении данных для файла в 10 млн строк размером почти 200Мб