Вопрос
Пишу: print "asd\n";
В текстовом виде перенос есть, а в html — нет. Использую <br>, что не всегда удобно. Обязательно ли использовать \n в конце строки print?
Ответ
В html работать и не будет, перенос строки по html-спецификации — тэг <br>
а \n
в конце print будет влиять только на удобочитаемость сгенерированной страницы при просмотре ее исходного кода, при этом увеличивается вес страницы на 1 байт с каждой строки. Если не нравится <br>
, можно прибегнуть к <pre></pre>
, но это не лучшее решение.
UPS
Вопрос
Язык я не знаю, так… читал пару скриптов. =) Но выучить хочется. Поэтому не подскажите ли где в Инете можно найти самоучитель по Perl-y? Знакомый кодер сказал что для начала неплохо было бы знать Си. Да вот только этот монстр меня пока пугает. На самом деле без Си не обойтись, или можно с нуля ринуться в бой? С JavaScript у меня как-то все быстро получается…
Ответ
Дык, а чего пугаться? Если хорошо в скриптах плаваешь, значит понятия об ООП есть, там то же самое, только в обезжиренном варианте, даже типы данных определять не требуется. Недавно скатывал туториал с
http://212.122.1.27/internet/perl_tut/ довольно неплохая вещь для начинающих…
ЗЫ: Катал ветку каталога Телепортом целиком, это онлайновый учебник, язык русский…
Из конференции Expert_FAQ
Вопрос
Где в Сети можно найти хороший самоучитель по Perl?
Ответ
http://perl.artil.ru — можно здесь,
а компилятор — http://dezine.ru/progs
Из конференции Expert_FAQ
Вопрос
Я хочу научиться программировать на Perl для того, чтобы создавать динамические страницы. Где можно достать подробную информацию с примерами и скачать готовые скрипты?
Ответ
http://perl.artil.ru- примеры и документация,
скачать интерпритатор под Win32 можно тут — http://dezine.ru/progs/
Из конференции Expert_FAQ
Вопрос
Как сделать так, чтобы читались n строк (с xx по yy)?
Ответ
while (<FILE>)
{
if ($номер_начальной_cтроки .. $номер_конечной_строки)
{
#Строка между заданными включительно
}
}
A.Z.
Вопрос
Как в Perl произвести чтение заданной строки (заданной по номеру) из какого-либо файла?
Ответ
1. Читать все строки до обнаружения нужной (open я опущу):
$.=0;
do {$line = <FILE> } until $. == $index || eof;
2. Если файл небольшой — загнать в массив
@lines = <FILE>; $line = $lines[$index];
3. Если есть модуль DB_File, можно связать массив с файлом:
use DB_File; use Fcntl;
$tie = tie (@lines,$file,O_RDWR,0666,$DB_RECNO) or die
""Can't open file $file: $!\n";
$line = $line[$index-1];
A.Z.
Вопрос
Я пишу web-галерею. Подскажите, как сделать на PERL так, чтобы под картинками отображались номера последующих страниц, но не все, а скажем, по 3-4, а дальше ссылка «next» на следующие (примерно так: 1,2,3,next), при нажатии на которую генерится следующая страница уже с другими тремя номерами и ссылкой назад «back» (т.е. так, «back»,4,5,6,"next»). Подскажите алгоритм реализации такой конструкции.
Ответ
#!/usr/bin/perl
#File: gallery.pl
#Галерея картинок
#Copyright © 2002 by A.Z.
use CGI qw/:standard/;
use strict;
my $path_to_script = "gallery.pl";
# В файле images.dat построчно лежат пути к картинкам
my $path_to_image_base = "images.dat";
my $count = 5;
my $from = param('from') || 0;
$from =~ s/^(\d+)/$1/;
my $prevtext = ($from>0)?"<a
href=\"$path_to_script?from=${\($from-1)}\">Prev</a>":"";
open(FILE, "< $path_to_image_base") or die "Can't open $path_to_image_base: $! \n";
my @images = <FILE>;
close FILE;
my $im_count = scalar @images;
my $nexttext = ($from+1<$im_count)?"<a
href=\"$path_to_script?from=${\($from+1)}\">Next</a>":"";
$from = $im_count-1 if $from>$im_count;
print header();
print <<END_HEAD
<HTML><BODY><TABLE width=100% height=100%>
<tr valigh="middle"><td align="center"><img src="$images[$from]"></td></tr>
<tr valigh="middle"><td align="center">
END_HEAD
;
print $prevtext;
for( my $i = (($from+$count)<$im_count)?$from:$im_count-$count; $i<($from+$count) &&
$i<$im_count;$i++){
if ($i != $from) {
print "<a href=\"$path_to_script?from=$i\">$i</a> ";
} else {
print " $i ";
}
}
print $nexttext;
print <<END_FOOTER
</td></tr></table>
</BODY></HTML>
END_FOOTER
A.Z.
Вопрос
Как выводить в ячейку таблицы совет дня, разный при каждом заходе?
Ответ
Нижеследующий фрагмент производит выборку из файла, каждый совет должен быть записан на отдельной строке:
#!/usr/bin/perl
$LIST = 'list';
use CGI;
$HEAD = new CGI;
open(LIST, "$LIST") || die "Can't read $LIST. $!";
srand($$ & time ^ $$);
@all = ;
$ban = splice(@all, int rand @all, 1);
chomp($ban);
print $HEAD->header('text/html');
print "$ban\n";
Файл с советами обзови list и брось рядом со скриптом.
Вопрос
Как выполнить обратное преобразование нормального текста в символы, например, %F2 ?
Ответ
$s =~ tr/+/ /;
$s =~ s/([\x00-\x1F\x7F\xFF])/ sprintf '%%%02X', ord($1) /eg;
Вопрос
Как можно проверять cgi-скрипты на домашнем компьютере?
Ответ
Для этого не советую качать Apache, так как настройка ее — дело тонкое. Я бы посоветовал бы ДЕНВЕР — программный комплекс. Намного меньше Perl, но эффективнее, при том наша разработка… Ссылка: http://www.dklab.ru… Там все подробно описано… Первый раз взял в руки Perl именно с этим комплексом
Из конференции Expert_FAQ
Вопрос
Имеется скрипт, который отсылает данные из формы на e-mail. Какую строчку нужно вставить, чтобы помимо этих данных отсылался адрес страницы, с которой скрипт запущен?
Ответ
Попробуй $ENV{'HTTP_REFERER'}
MSknyaz
Вопрос
Можно ли из Perl скрипта каким-то образом вызвать Tar и извлечь из архива файл?
Ответ
#!/usr/bin/perl
use Archive::Tar;
my $tar = Archive::Tar->new();
$tar->add_files("file1", "file2", "file3");#Список файлов
$tar->write('files.tar');
#!/usr/bin/perl
my ($tar, @files);
$tar = Archive::Tar->new();
$tar->read('files.tar');
@files=$tar->list_files();
$tar->extract(@files);
Green Kakadu
Вопрос
Опишите пожалуйста во всех подробностях настройку Perl под Apache.
Ответ
Вы должны разместить Perl в той же директории, в которой он находится на Вашем настоящем Web-сервере. Заметьте, что это очень важно, так как Perl требует, чтобы в каждом скрипте первой строкой стоял путь к Perl-интерпретатору. Например, эта строка может выглядеть так:
#!/usr/local/bin/perl
Эту же строку можно было бы написать и так:
#!/usr/local/bin/perl.exe
или даже так:
#!d:\usr\local\bin\perl.exe
Это заставляет Apache искать Perl-интерпретатор в директории d:/usr/local/bin/ (если диск d: не указан, это означает, что он совпадает с диском, на котором расположен Apache). Ясно, что если Вы установите Perl не в такую же директорию, как на настоящем Web-сервере, Вам придется каждый раз менять эту самую первую строку во всех скриптах при закачке на сервер. Итак, далее мы будем считать, что эта директория такова, как на большинстве серверов: /usr/local/bin
Если Вы все же установите пути неправильно, Apache выдаст непонятное сообщение об ошибке, а в errors.log появится сообщение: couldn't spawn child process.
Вот шаги, приводящие к цели:
Скачайте дистрибутив Perl. Его размер составляет 1.41 Мб. Это самораспаковывающийся архив, Вам нужно будет его просто запустить и указать директорию d:/usr/local/.
Теперь настроим сервер. Найдите в файле конфигурации Apache conf/httpd.conf строчку «AddHandler cgi-script .bat .exe». Замените ее на «AddHandler cgi-script .bat .exe .pl .cgi»
Создайте директорию d:\usr\bin и скопируйте из папки d:/usr/local/bin два файла: perl.exe и perl300.dll.
Вот, собственно, и все. Можете пользоваться Perl-транслятором.
Денис Куксюк (Internet Zone #57)
Вопрос
Как переводить вот такое «%C3%E0%E7%E5%F2%E0+%E1%» в нормальный текст?
Ответ
$s =~ tr/+/ /;
$s =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg;
Вопрос
С помощью каких программ можно преобразовать скрипт языка Perl в файл с расширением «ехе»?
Ответ
Perl2Exe
http://www.indigostar.com/download/p2x-5.03-Win32.zip
Perl2Exe is a command line utility for converting Perl scripts to executable files.
Perl2Exe also allows you to create no-console programs using Tk. Perl2Exe for Unix can generate executables for supported Unix machines. Perl2Exe for Unix can also be used from a Win32 host to generate executables for a Unix target host.
Размер архива — 1768307 байт.
Bogdan
Вопрос
Как написать небольшой скрипт, чтобы при загрузке HTML в отдельном месте выводилось текстовое сообщение, типа совет дня, и как его вставить в HTML?
Ответ
Очень просто.
Создаешь текстовый файл, например
/var/www/html/sovet.txt
(При условии, что скрипт крутится на локалхосте, у тебя *nix+apache, дефолтовые настройки, если это не так, то поменяй пути к файлам).
Туда пишешь по одному совету на сторку. Дальше, собсна скрипт:
#!/usr/bin/perl -w print "Content-type:text/html\n\n";
# см. спецификацию http print "<html><body>";
# Дальше пишешь print и код своей хтмл-страницы до того
# места где долен быть совет дня print "Совет дня:";
# вот здесь печатаем совет дня. open (SOVET, "/sovet.txt");
# здесь твоей корневой диекторией является /var/www/html,
# когда будешь заливать скрипт на хостинг, посмотри в
# справке путь к перлу и дерево каталогов @Sovet = <SOVET>;
# Читаем открытый файл в массив $i = rand($#Sovet);
# $i выбирается случайно в диапазоне от 0 до кол-ва
# элементов в массиве $i = int $i;
# отбрасываем дробную часть print $Sovet[$i];
# Печатаем элемент массива с индексом $i
# Здесь печатаешь остаток твоего ХТМЛа print </body></html>;
Из конференции Expert_FAQ
Вопрос
Есть сайт, который разбит на несколько листов. Необходимо на каждой странице сделать ссылки на все остальные в виде номеров, например: 1|2|3|…|11|12. Как это сделать?
Ответ
Начальное количество страниц — 10.
#!/usr/bin/perl
$n=10; #кол-во страниц в тексте
$pfx="page"; # префикс страничек
print "Content-Type: text/html\n\n";
for ($i=1;$i<=$n;$i++)
{
$name=$pfx.$i.".html";
if ($name eq $ENV{'DOCUMENT_NAME'}){$itm="$i";}
else {$itm="<A href=\"$name\">$i</A>";}
print $itm;
if ($i<$n){print " | ";}
}
Andrew Cnorny
При добавлении новых страниц нужно просто изменить $n в начале скрипта и обновить скрипт.
Вопрос
Как переменной в Perl назначить число, равное количеству строк в каком-либо файле?
Ответ
1. В некоторых системах (проще говоря, в Юникс) есть программка wc, которая считает строки в файле:
$count = 'wc -l < $file'; die "wc failed: $?" if $?; chomp($count);
2. open (FILE,"< $file") or die "Can't open $file: #!"; $count++ while <FILE>;
3. Если работаете одновременно только с одним файлом. Переменная $. содержит количество прочитанных строк с момента последнего явного вызова close
open (FILE,"< $file") or die "Can't open $file: #!"; 1 while <FILE&glt;; $count = $.;
A.Z.
Вопрос
Какую информацию можно выудить из переменных окружения вроде $HTTP_REFERER?
Ответ
Посмотрите все, что есть и выберете нужное:
#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";
foreach ( sort keys %ENV ) { print "$_ = $ENV{$_}\n"; }
Lena
Вопрос
Как установить Perl на Windows 98?
Ответ
Сам перл? Легко. Просто пропиши компилятор (perl.exe) в путях. Где взять компилятор? Поищи на www.activestate.com
Если же хочешь тестировать скрипты из броузера, поставь сервер. У меня Eserv — не жалуюсь. Можешь Apache установить — он практически самый распространенный.
B_Joker
Вопрос
Какой Perl-командой можно перенаправить STDERR в STDOUT?
Ответ
Если скрипт выдает HTML:
BEGIN {
$| = 1; # autoflush
print "Content-type: text/html\n\n";
$| = 0;
open (STDERR, ">&STDOUT");
}
Если картинку — тогда так:
BEGIN {
$SIG{'__DIE__'} = $SIG{'__WARN__'} = sub {
( $errlog_filename = $ENV{'SCRIPT_FILENAME'} ) =~ s/\w+$/errlog/;
if ( open( ERRLOG, ">>$errlog_filename" )) {
print ERRLOG $_[0];
close ERRLOG;
}
};
}
Lena
Вопрос
Какой конструкцией правильнее воспользоваться для вставки рисунка в HTML документ, если я делаю этот документ в Perl-скрипте? Рисунок лежит, конечно, не в папке cgi-bin.
Ответ
print qq{
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/kartinka.gif"></td>
</tr>
};
// kartinka.gif Лежит в папке ./htmldocs/
// Или как она у тебя называется — это не важно
Из конференции Expert_FAQ
Вопрос
Есть ли какой-нибудь «домашний» сервер pop и smtp под Windows, чтобы на нем можно было отлаживать программы на Perl'е, использующие работу с почтой?
Ответ
Я использую или Eserv или MDaemon.
Павел
Вопрос
Кто-нибудь, дайте, пожалуйста, готовый или помогите написать простой cgi скрипт: на странице есть 4 формы, после нажатия кнопки «отправить» скрипт записывает содержимое в файл.
Ответ
Форма должна сабмититься на CGI-скрипт, который и записывает в файл. Вот пример скрипта…
#!/usr/bin/perl
use CGI qw(:standart);
$inQuery = new CGI;
$password=$inQuery-<param("password");
#это те самые параметры $login=$inQuery-<param("login");
#которые передает форма $mail=$inQuery-<param("mail");
# $user=$inQuery-<param("name");
#это к примеру
$sity=$inQuery-<param("city");
# open (FILE, "<<filename");
#а вот здесь ты их и записываешь в файл через разделитель ":" в данном случае:
print FILE "$login:$mail:$password:$name:$city\n";
close (FILE);
Вопрос
Подскажите, есть ли какая-нибудь хорошая программа для разработки на Perl, чтобы подсветка синтаксиса была и т.п.? Блокнот — это, конечно, круто, но не очень удобно при больших текстах.
Ответ
EditPlus — легонький редактор для всего (подсветка, cliptext). http://www.editplus.com
Правда, shareware, но лечится.
Mastak Absolute Perl — подсветка, отладка и еще кое-что хорошего, но, бывает, глючит, особенно на отладке. Free.
http://aperl.mastak.ru/
OptiPerl 3 — вот это просто конвейер по производству скриптов =) Delphi для Perl и даже, возможно, больше. Но есть 2 недостатка: тяжеловат на взлет и работающего кряка для 3.5 пока нет.
А также есть UltraEdit, HomeSite, на activestate.com наряду с activeperl и другими лежит агрегат под названием komode. Там вообще навороченная вещь, и не только для perla.
А еще — Perl Builder, Collie Perl Shell и т.д.
A.Z., Sergey Y. Khomutov, Максим, MSknyaz
Вопрос
Как сделать, чтобы программка написанная на Perl запускалась в windows-e с расширением .exe ? Что именно надо сделать, чтобы программа имела расширение .exe и запускалась ? В общем, чтобы работала не из ДОСа.
Ответ
Есть специальный компилятор для Perl perl2exe компелит из Перловых исходников выполняемые файлы. Ссылка www.indigostar.com
Из конференции Expert_FAQ
Декомпилит обратно :)
#!/usr/bin/perl
$dir = @ARGV[0];
open (data, "$dir");
binmode(data);
system ("mkdir src.$dir");
#seek (data, 671420,0);
$f=0;
while ($line = ){
if ( $line =~ m/(\w+\.\w*pl).\n/g or $line =~
m/(\w+\.\w*pm).\n/g) {
$name=$1;
$cur_d=tell(data);
$f=1;
print ("\n offset: $cur_d ");
} elsif ( $f == 1 and $line =~ m/\-(\d+)/) {
print ("Found file: $name ");
print ("length: $1\n");
$f=2;
$cur=tell(data);
$len=$1;
} elsif ( $f == 2 ) {
open(new, ">src.$dir/$name");
seek (data, $cur, 0);
read (data,$tmp,$len);
$tmp = decrypt ($tmp);
print new $tmp;
$f=0;
}
}
sub decrypt {
($text) = @_;
$key = "For more information visit www.indigostar.com";
$key_len = length($key);
$len = length($text);
$offset = 0;
while ($offset <= ($len)){
$str = substr($text, $offset, $key_len)
; $len_s = length($str);
$key = substr($key, 0, $len_s);
$crypt_t = $str ↑ $key;
$crypt = "$crypt"."$crypt_t";
$offset = $offset+$key_len;
}
return $crypt;
}
igorsd
Copyright 2000-2004 Сообщество Чайников
Контактная информация