Forum Webscript.Ru
Программирование => Perl => Тема начата: GoDleSS от 20 Февраля 2003, 08:53:03
-
Как говорится, люди добрые помогите тупому недопрограммисту =)
В общем проблема такая:
Имеется файл, откуда считываются данные в массив(что-то вроде @filesource=;) и куда вписываются новые строки(через цикл все строки массива, в который записали старые данные+новая строка). Так вот как бы сделать так, чтобы был вывод последних скажем 50 эллементов массива(т.е. еще и убрать ненужные вначале), а не первых, как это получается в таком примерно виде:
Считываем:
open(DATAFILE, "datafile1");
@filesource=;
close(DATAFILE);
Записываем:
open (DATAFILE, ">datafile1");
print DATAFILE "\\n";
for ($i = 1; $i < 50; $i++) {
print DATAFILE "$filesource[$i]";
}
print DATAFILE $new;
close DATAFILE;
Кто не понял, это кусочек простенького чата...
-
Для последних элементов используй отрицательные индексы:
foreach $i (reverse 1..50)
{
print DATAFILE $filesource[-$i]
}
или
foreach $i (-50..-1)
{
print DATAFILE $filesource[$i]
}
:)
-
Считываем:
@filesource = reverse ;
-
Опробовал ваши предложения - 0 результата, давайте я выложу весь исходник(только пожалуйста без распространения), я уже неделю просто над этой пробемой бьюсь, а все никак :(
В общем надо чтобы сообщения в чате нормально добавлялись, но чтоб при этом новая мессага не перетерала последний элемент массива, как это получается у меня...
[CODE]
#!/usr/bin/perl
#################################
#Scripted by CheRt[aka_GoDleSS] #
#©2003 #
#################################
$filepath=\'/inetpub/wwwroot/cgi-bin/mch/\';
$filext=\'mes.html\';
$clearfile=\'clear.pl\';
#--------------localtime
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$time1=$hour;
$time2=$min;
$time3=$sec;
if ($time1<10) {
$time1="0$time1";
}
if ($time2<10) {
$time2="0$time2";
}
if ($time3<10) {
$time3="0$time3";
}
#-----------------------
print "Content-type: text/html\\nPragma: no-cache\\n\\n";
print "";
print "\\n";
&getform;
if (&getoldfile) {
&printform;
&wfile;
}
else
{
print "Скрипт работает нестабильно, сообщи администрации
\\n";
}
print "\\n";
exit(0);
sub getform {
$buffer = "";
read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
@pairs=split(/&/,$buffer);
foreach $pair (@pairs)
{
@a = split(/=/,$pair);
$name=$a[0];
$value=$a[1];
$value =~ s/\\+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/~!/ ~!/g;
$value =~ s/\\\\<\\;/g;
$value =~ s/\\>/\\>\\;/g;
$value =~ s/[\\r\\n]//g;
push (@data,$name);
push (@data,$value);
}
%form=@data;
%form;
}
sub getoldfile {
$form{\'room\'} =~ s/\\W//g;
return 0 unless open(DATAFILE, "$filepath$form{\'room\'}$filext");
@filesource=;
close(DATAFILE);
return 1;
}
sub printform {
if ($form{\'logoff\'} eq \'1\') {
print << "EOF";
EOF
} else {
print << "EOF";
EOF
}
}
sub wfile {
$color = "$form{\'color\'}";
$newmessage = "\\ \\;($time1:$time2:$time3)$form{\'uname\'}: $form{\'mes\'}
\\n";
open (DATAFILE, ">$filepath$form{\'room\'}$filext");
print DATAFILE "\\n";
for ($i = 1; $i < 50; $i++) {
print DATAFILE $filesource[$i];
}
print DATAFILE $newmessage;
close DATAFILE;
}
-
давайте я выложу весь исходник(только пожалуйста без распространения)
Лол.:)))) Готовый коммерческий продукт.:))))))
Только стиль пограммирования в стиле Matt\'s scripts archive.:)))
Опробовал ваши предложения - 0 результата
#!/usr/bin/perl
@a = (\'1\',\'2\',\'3\');
foreach $i (reverse(1..2))
{ print $a[-$i];
}
---------- Perl Run ----------
23
Output completed (0 sec consumed) - Normal Termination
Как видишь - по способу mike результат есть.:)
-
Готовый комерческий говоришь?! Да, я брал готовый простейший чат когда-то давно, когда начал изучать Перл, но если посмотришь, то в нем уже и трети нет от того, что было в начале, т.е. постепенно я его почти полностью изменил под себя, но так как учился на нем, то и стиль этот приобрел... Так что не строй из себя крутого программера, все знающего, не заметно, а раз я сказал: не работает, значит не работает у меня - пробовал...
-
Набираем:
#!/usr/bin/perl
@a = (\'1\',\'2\',\'3\');
foreach $i (reverse(1..2))
{ print $a[-$i];
}
print header;
print @a;
Получаем:
23123
По-моему , не то что нужно ....
-
А ты попробуй сообщения в файл не дописывать, а ципать их сначала в массив, потом добавляй в начало массива новое сообщение и переписывай весь файл. Мессаги будут храниться в файле (и в считанном оттуда массиве) в нужном тебе порядке. Ты их скока захочешь - столько покажешь. Если не хранить в этом файле очень много сообщений, то могет получиться.
-
GoDleSS, если ты не можешь пять строчек скопировать, здесь тебе не помогут. Посмотри, что тебе написал Chs и что написал ты. Все работает правильно.
-
А ты попробуй сообщения в файл не дописывать, а ципать их сначала в массив, потом добавляй в начало массива новое сообщение и переписывай весь файл. Мессаги будут храниться в файле (и в считанном оттуда массиве) в нужном тебе порядке. Ты их скока захочешь - столько покажешь. Если не хранить в этом файле очень много сообщений, то могет получиться.
Дело в том, что я так уже пробовал - все работает, но при этом новые сообщения чата будут появляться наверху, а н снизу, что мне не надо, а вот если сделать так, но чтоб снизу, то только с бесконечным массивом у меня работает все правильно(представь сколько чат будет грузиться через полчаса разговора!), а с заданым глючит.
-
GoDleSS, если ты не можешь пять строчек скопировать, здесь тебе не помогут. Посмотри, что тебе написал Chs и что написал ты. Все работает правильно.
Поверь мне, что 5 строчек я скопировать могу(да и сам написать значительно больше 5 строк), кому сильно интересно могу даже немного недописанного бота для довольной известной игры БК(http://www.combats.ru) подкинуть...
А тем не менее у меня глючит с вашими предложениями чат, хотя отдельно само предложение работает нормально, ладно, спасибо всем - пойду копаться, может и получиться.
-
но при этом новые сообщения чата будут появляться наверху
Перед показом бери из массива 50 (например) штук первых в другой массив, делай ему реверс и вперед. Покажутся снизу.
-
GoDleSS
чтобы был вывод последних скажем 50 эллементов массива
@a = (\'1\',\'2\',\'3\');
foreach $i (reverse(1..2))
{ print $a[-$i];
}
print header;
print @a;
По-моему , не то что нужно ....
Само собой, если ты выводишь несколько последних элементов, а потом зачем-то приписываешь к ним остальной массив. Сравни с тем, как ты описал проблему.
А тем не менее у меня глючит с вашими предложениями чат, хотя отдельно само предложение работает нормально
[OFF]Предложение - это не готовая к использованию часть скрипта, а просто подсказка, как можно решить твою проблему. Твои скрипты за тебя писать никто не будет.[/OFF]