Forum Webscript.Ru

Программирование => Perl => Тема начата: Sergo_stavropol от 27 Сентября 2002, 14:08:07

Название: Запись в файл: подскажите раз и навсегда!
Отправлено: Sergo_stavropol от 27 Сентября 2002, 14:08:07
Друзья, хелп!
Что-то я окончательно запутался во множестве примеров, а нужно решить элементарнейшую задачу.  Решил, что лучше спросить всего один раз у знающих людей, чем лопаптить инет.

В общем, нужно определить ip посетителя и записать ip в файл
Насчет определить ip понятно, с файлом мучаюсь

#!/usr/bin/perl
$ip=$ENV{\'\'REMOTE_ADDR"};

а дальше как быть?

огромное все спасибо!!!!!!
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: NeoNox от 27 Сентября 2002, 14:44:40
#!/usr/bin/perl
use strict;

my $ip=$ENV{\'\'REMOTE_ADDR"};
my $counterfile=\'ip.txt\';

print "Content-type: text/html\\n\\n";

open (CF,">$counterfile")|| die "Не могу записать в каунтерфайл: $!";
print CF $ip;
close(CF);
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: mike от 27 Сентября 2002, 15:25:26
Цитировать

open (CF,">$counterfile")|| die "Не могу записать в каунтерфайл: $!";


Если нужно кучу IP записать в один файл, то наверное правильнее ( хм... куда уж правильнее :D ) было бы append\'ить:

open (CF,">>$counterfile")|| die "Не могу записать в каунтерфайл: $!";
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: NeoNox от 27 Сентября 2002, 15:55:47
Цитировать
куда уж правильнее

из вопроса это не следует.
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: mike от 27 Сентября 2002, 16:37:48
2NeoNox:

Цитировать
Цитата:
куда уж правильнее

из вопроса это не следует.


Никакого наезда на вопрос и ответ, если он [наезд] там просматривается. :-|
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: NeoNox от 27 Сентября 2002, 16:52:41
mike :D. Тебе показалось. Все Ок!
Я лишь сказал, что задача поставлена так:
Цитировать
нужно определить ip посетителя и записать ip в файл
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: Sergo_Stavropol от 28 Сентября 2002, 07:06:33
Спасибо!
Да, я действительно не сказал, что нужно было кучу ip записать, а это дейтсвительно так
Более того, хотелось бы ip заносить в новую строчку при каждом новос коннекте (даже если это тот же самый ip)
Сорри что сразу не сформулировал сразу правильно задачу. Если можно,  подскажите плиз еще и это :)

Заранее БЛГДРН.
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: Ленивый гость от 28 Сентября 2002, 07:13:33
В общем, чтобы было совсем уж конкретно, попрошу перевести нижеприведенный php-скрипт в cgi-скрипт

$ip = getenv(\'REMOTE_ADDR\');
$host = gethostbyaddr($ip);
$date=date(\'d-m- Y, H:i:s\');
$os=$HTTP_USER_AGENT;
$lf=fopen("logzzz",\'a\');
fwrite($lf,"\\n  $date   $ip   $host   $os");
$lf=fclose($lf);


мужики, с меня :beer:  :)
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: NeoNox от 28 Сентября 2002, 14:34:10
#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);

$counterfile = "log.txt"; #Файл, куда это добро сваливается

# Снимаем текущую дату \'d-m- Y, H:i:s\'
($second,$minute,$hour,$day,$month,$year,$weekday) = (localtime(time))[0,1,2,3,4,5,6];
$year +=1900;
if ($minute < 10) {$minute = "0"."$minute";}
if ($second < 10) {$second = "0"."$second";}
if ($hour eq "0") {$hour = "12";}
if ($month < "10") {$month = "0".$month}
if ($day < "10") {$day = "0".$day}
$time = "$day-$month-$year, $hour-$minute-$second";

# Снимаем всякие переменные окружения
$ip = $ENV{\'REMOTE_ADDR\'};
@digits = split (/\\./, $ip);
$address = pack ("C4", @digits);
$host = gethostbyaddr ($address, 2);
   
    $language = $ENV{\'HTTP_ACCEPT_LANGUAGE\'};
$http_referer = $ENV{\'HTTP_REFERER\'};
$remote_addr = $ENV{\'REMOTE_ADDR\'};
$http_user_agent =  $ENV{\'HTTP_USER_AGENT\'};
$request_uri =  $ENV{\'REQUEST_URI\'};
if ($ENV{\'HTTP_REFERER\'} eq "") {$http_referer = "None";}

print "Content-type: text/html\\n\\n";

$log_vars = "$time|$remote_addr|$http_user_agent|$request_uri|$http_referer|$language|$host \\n";

open (CF,">>$counterfile")|| die "Не могу записать в каунтерфайл: $!";
print CF $log_vars;
close(CF);

Разделители между значениями "|"
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: КшЫуфксрук от 28 Сентября 2002, 19:28:39
> $time = "$day-$month-$year, $hour-$minute-$second";

И получаем "28-08-2002, 9-27-17", а на дворе осень...
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: Sergo_Stavropol от 29 Сентября 2002, 13:02:59
Огромное всем спаибо!!!
Все пошло!!
:beer:
:beer:
:beer:
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: NeoNox от 30 Сентября 2002, 10:44:24
Цитировать
И получаем "28-08-2002, 9-27-17", а на дворе осень...

[OFF]
Не может быть! У нас в Киеве лето :)
[/OFF]
Sergo_Stavropol, поправь код. Лажанулся я...


# Снимаем текущую дату \'d-m- Y, H:i:s\'
 ($second,$minute,$hour,$day,$month,$year,$weekday) = (localtime(time))[0,1,2,3,4,5,6];
$year +=1900;
$month++;
if ($minute < 10) {$minute = "0"."$minute";}
if ($second < 10) {$second = "0"."$second";}
if ($hour eq "0") {$hour = "12";}
if ($month < "10") {$month = "0".$month}
if ($day < "10") {$day = "0".$day}
$time = "$day-$month-$year, $hour-$minute-$second";
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: Sergo_stavropol от 04 Октября 2002, 18:29:08
Спасибо еще раз тов. NeoNox!
Все великолепно работает.
Только по пути как обычно возникают еще вопросы: например, как сделать так,  чтобы новая запись в каунтерфайл выводилась в начале списка?

Заранее БЛГДРН.

PS Чувствую, надо регаться. Форум классный,  реальная помощь чайникам. :) :beer:
Название: Запись в файл: подскажите раз и навсегда!
Отправлено: mike от 04 Октября 2002, 20:32:30
Цитировать
Только по пути как обычно возникают еще вопросы: например, как сделать так, чтобы новая запись в каунтерфайл выводилась в начале списка?

С этим посложнее будет, т.к. нужно сначала создавать временный файл, писать в начало нужную строку, дописывать старое... А это - тормоза. Так ли нужно это в логе?

2NeoNox: из чисто академического интереса такой вопрос. Есть код
Цитировать
if ($minute < 10) {$minute = "0"."$minute";}
if ($second < 10) {$second = "0"."$second";}
if ($hour eq "0") {$hour = "12";}
if ($month < "10") {$month = "0".$month}
if ($day < "10") {$day = "0".$day}
$time = "$day-$month-$year, $hour-$minute-$second";


Здесь sprintf не используется из соображений скорости, безопасности? Т.к. гораздо приятнее было бы

if ($hour == 0) {$hour = 12}
$time = sprintf "%02d-%02d-%04d, %02d-%02d-%02d",
            $day,$month,$year,$hour,$minute,$second;

:)