Perl HTML Table - проблема с выводом
167 сообщений
#15 лет назад
Никак не выходит вывести другую переменную или значение.Подозреваю, что как то может быть связанно с особенностью содержимого переменной. (скорее оно так и есть).
Помогите разобраться=) устал уже биться с этим..
Собственно код ниже, комментарий с ударениями - место глюка (моего)
167 сообщений
#15 лет назад
#!"U:/usr/local/Perl 5/bin/perl.exe";#use strict;
use CGI qw/:cgi :form/;
print "Content-type: text/html\n\n";
print <<"EOH";
<html>
<head>
<meta http-equiv=\"Content-type\" content=\"text/html; charset=windows-1251\">
</head>
<body>
<pre>
EOH
#получение текста----------------------------------
my $text=param("texttest"

my $max=0;
#перенос информации в массив+его обработка---------
my @stroki=split(/\n/g,$text);
my @slova;
my @res;
my $i=0,$j=0;
foreach(@stroki){
$j=0;
@slova=split(/\,/g,$_);
if($max<(@slova)){
$max=@slova;
};
chomp($slova);
foreach(@slova){
$res=$_;
};
$i++;
};
#проверка - в каких колонках как выводить-------------
my %align; #0-no 1-left 2-center 3-right
$i=$j=0;
for($j=0;$j<$max;$j++){
$align{$j}=0;
for($i=0;$i<@res;$i++){
if($res){
if(($res=~//)&&($res=~//)){
$align{$j}=2;
}elsif(!($res=~//)&&($align{$j}==0)){
$align{$j}=3;
}elsif(!($res=~//)&&($align{$j}==0)){
$align{$j}=1;
}elsif(!($res=~//)&&($align{$j}==1)){
$align{$j}=2;
}elsif(!($res=~//)&&($align{$j}==3)){
$align{$j}=2;
};
print "$i:$j-$align{$j} ";
}else{
print "x:x-x ";
};
};
print "\n";
if($align{$j}==0){
$align{$j}=2;
};
};
#вывод хеша
#foreach(keys(%align)){
# print "$_:$align{$_} ";
#};
#вывод результата
my $buf=1;
print "<BR><TABLE ALIGN=\"center\" VALIGN=\"center\" BORDER>";
print "<CAPTION>The Result</CAPTION>";
foreach(@res){
$j=0;
print "<TR>";
while($_->){
print "<TD align=";
if($align{$j}==1){ print "\"left\"";};
if($align{$j}==2){ print "\"center\"";};
if($align{$j}==3){ print "\"right\"";};
#if($align{$j}==3){
# print "$_->";
#};
print " width=200px>";
print "$_->"; #ей богу ТУПОСТЬ/ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
print "</TD>";
};
print "</TR>";
};
print "</TABLE>";
#-----------------------------------------------------
print "\n";
print << "EOH"
</pre>
</body>
</html>
EOH
167 сообщений
#15 лет назад
Прога получает из текстовой области текст, разбивает по запятым(CSV) по переносам.Потом выводит в виде таблицы. Колонки чисто с текстом выравниваются слева, чисто с цифрами - справа. Остальное по центру
думаю некоторым пригодится форма:
#!"U:/usr/local/Perl 5/bin/perl.exe";
#use strict;
print "Content-type: text/html\n\n";
print <<"EOH";
<html>
<head>
<meta http-equiv=\"Content-type\" content=\"text/html; charset=windows-1251\">
</head>
<body>
<pre>
EOH
#форма, получающая текстовые данные
print << "FORM";
<FORM action="logon.pl" method="POST">
<TEXTAREA NAME="texttest" ROWS=15 COLS=65 style="overflow: hidden" MAXLENGTH=975></TEXTAREA>
<INPUT TYPE="submit" VALUE="OK"><INPUT TYPE="reset" VALUE="NO">
</FORM>
FORM
print << "EOH2"
</pre>
</body>
</html>
EOH2
626 сообщений
#15 лет назад
1. Всегда используйте режим strict - это значительно упростит отладку скриптов.2. my @stroki=split(/\n/g,$text); - здесь режим g абсолютно не нужен, split и так режет по всем вхождениям шаблона.
3. chomp($slova); - что мешает чомпать строку до того. как вы её порежете?
4. никакой гарантии что сработает именно так как вы думаете
5. my $i=0,$j=0; - это просто неправильно
Но даже несмотря на всю кошмарность кода (регулярки я просто не смотрел чтобы мозг не сломать ), оно работает.
Но вот чего оно не делает, так не квотит HTML в исходных данных - отсюда скорее всего и проблема, т.к. поломать таблицу - делать нечего. Да и XSS как раз вот так и получаются.
Заквотить HTML можно функцией encode_entities из модуля HTML::Entities
167 сообщений
#15 лет назад
=)) Кошмарность, это понятно 
Цитата ("Demiurh"):
1. Всегда используйте режим strict - это значительно упростит отладку скриптов.
ну стрикт я специально не использовал, поленился. Хотя надо привычку сделать.
Цитата ("Demiurh"):
2. my @stroki=split(/\n/g,$text); - здесь режим g абсолютно не нужен, split и так режет по всем вхождениям шаблона.
это точно, лень опять же
Цитата ("Demiurh"):
3. chomp($slova); - что мешает чомпать строку до того. как вы её порежете?
Ну а chomp я делал поставил когда начал ошибку искать - думал последнее слово может прихватить с собой перенос, хотя.. это ничего страшного
Цитата ("Demiurh"):
5. my $i=0,$j=0; - это просто неправильно
не знал.. думал раз это C++ подобный язык, то можно, вроде можно. Хотя приму к сведению
регулярки -они просто проверяют что за набор символов: цифры/буквы/цифробуквы
А сейчас буду разбираться с таблицей. Наверняка мелочь какая то

Вопрос собственно был с тем связан, что мне не удается вывести ничего кроме Цитата ("deHimer"):
print "$_->";
167 сообщений
#15 лет назад
#!"U:/usr/local/Perl 5/bin/perl.exe";use strict;
use CGI qw/:cgi :form/;
print "Content-type: text/html\n\n";
print <<"EOH";
<html>
<head>
<meta http-equiv=\"Content-type\" content=\"text/html; charset=windows-1251\">
</head>
<body>
<pre>
EOH
#получение текста----------------------------------
my $text=param("texttest"

my $max=0;
#перенос информации в массив+его обработка---------
my @stroki=split(/\n/g,$text);
my @slova;
my @res;
my $i=0;
my $j=0;
foreach(@stroki){
$j=0;
@slova=split(/\,/g,$_);
if($max<(@slova)){
$max=@slova;
};
chomp($slova);
foreach(@slova){
$res=$_;
};
$i++;
};
#проверка - в каких колонках как выводить-------------
my %align; #0-no 1-left 2-center 3-right
$i=$j=0;
for($j=0;$j<$max;$j++){
$align{$j}=0;
for($i=0;$i<@res;$i++){
if($res){
if(($res=~//)&&($res=~//)){
$align{$j}=2;
}elsif(!($res=~//)&&($align{$j}==0)){
$align{$j}=3;
}elsif(!($res=~//)&&($align{$j}==0)){
$align{$j}=1;
}elsif(!($res=~//)&&($align{$j}==1)){
$align{$j}=2;
}elsif(!($res=~//)&&($align{$j}==3)){
$align{$j}=2;
};
#print "$i:$j-$align{$j} ";
}else{
#print "x:x-x ";
};
};
#print "\n";
if($align{$j}==0){
$align{$j}=2;
};
};
#вывод хеша
#foreach(keys(%align)){
# print "$_:$align{$_} ";
#};
#вывод результата
my $prt2;
print "<BR><TABLE ALIGN=\"center\" VALIGN=\"center\" BORDER>";
print "<CAPTION>The Result</CAPTION>";
foreach my $prt(@res){
$j=0;
print "<TR>";
while($prt->){
my $prt2=$prt->;
print "<TD align=";
if($align{$j}==1){ print "\"left\"";};
if($align{$j}==2){ print "\"center\"";};
if($align{$j}==3){ print "\"right\"";};
print " width=200px>";
if($align{$j}==3){
my $str=$prt2;
my ($strl,$strr)=split(/\./,$str);
my @x;
$str=0;
my $ugu=1;#!
do{
$strl=~s/(\d{3})?$//;
unshift @x,"\ ".$&;
if(!($&

unshift @x,$strl;
$strr=~s/^(\d{0,2})?//;
if($&

push @x,"\,".$&;
};
print @x;
$ugu=0;
#last;
};
}while($ugu);
}else{
print "$prt2";
};
print "</TD>";
$j++;
};
print "</TR>";
};
print "</TABLE>";
#-----------------------------------------------------
print "\n";
print << "EOH"
</pre>
</body>
</html>
EOH
вот этот теперь работает.