СообЧа > База Знаний > Интернет > Веб-строительство > Perl

Вопрос

Пишу: 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 Сообщество Чайников
Контактная информация