2009-11-06 3 views
1

Я пытаюсь изменить скрипт Perl для создания другого/нового файла журнала каждый раз при запуске скрипта. Я пытался создать каждый файл журнала по дате, но у меня возникли проблемы, включающий эту концепцию ... Это то, что я до сих пор:Как написать скрипт Perl, который генерирует новый файл журнала каждый раз, когда он запускается?

#!perl -w 

use WWW::Mechanize; 

# What URL shall we retrieve? 
$url = "http://www.mediabase.com/whatsong/whatsong.asp?var_s=075068071069045070077"; 

# Create a new instance of WWW::Mechanize 
# enabling autocheck checks each request to ensure it was successful, 
# producing an error if not. 
my $mechanize = WWW::Mechanize->new(autocheck => 1); 

# Retrieve the page 
$mechanize->get($url); 

# Assign the page content to $page 
my $page = $mechanize->content; 

# Output the page 
#print $page; 

# Let's also save the page locally 
open LOG, ">>", "102.1_content.txt"; 

#print LOG $page; #######get error here when run from c++.... 

close(LOG); 
######################################## 
######################################## 
# INPUT_FILE 
open INPUT_FILE, "<", "102.1_content.txt"; 
######################################## 
my $html = join '', <INPUT_FILE>; 

my @stuff = $html =~ />([^<]+)</g; 
######################################## 

use Time::localtime; 
$tm = localtime; 
print "*****", $tm->mon+1, "/", $tm->mday, "/", 
     $tm->year+1900, "--", $tm->hour, "::", 
     $tm->min, "::", $tm->sec, 
     "******************************"; 
##sec, min, hour, mday, mon, year, wday, yday, and isdst 
######################################## 
# OUTPUT_FILE 
open OUTPUT_FILE, ">>", ("PLAYLIST_TABLE_"$tm->mon+1, "/", $tm->mday, "/", tm->year+1900".txt") or die $!; 
######################################## 
print OUTPUT_FILE "******************************", 
      $tm->mon+1, "/", $tm->mday, "/", $tm->year+1900, 
      "--", $tm->hour, "::", $tm->min, "::", $tm->sec, 
      "******************************"); 

print join (" ", @stuff), "\n"; 

print OUTPUT_FILE join ("   ", @stuff), "\n"; 

print "thats all!\n"; 

close(INPUT_FILE); 
close(OUTPUT_FILE); 

Я извиняюсь, я знаю, что мой код грязный, и спасибо авансовый ...

Ник

+8

Я вижу отказ «использовать строгую», синтаксическую ошибку или две попытки и попытаться проанализировать HTML с помощью регулярных выражений. Вы должны исправить это, чтобы избежать неприятностей позже. –

ответ

2

Вы должны использовать . (точка) для конкатенации строк. Здесь для строки имени файла становится:

open (OUTPUT_FILE, ">> PLAYLIST_TABLE_" . ($tm->mon+1) . "/" . $tm->mday . "/" . ($tm->year+1900) . ".txt") or die $!; 

, (запятая) работает только с print AFAIK, и только потому, что обычное преобразование массива в строку является конкатенация для print.

+0

Хорошо спасибо человеку, я знал, что это должно быть что-то простое ха-ха, спасибо! :) – nick

+2

Отметьте его ответ тогда! – Geo

+0

, потому что код не работает ... – nick

4

Использование File::Spec или Path::Class манипулировать имена файлов и пути:

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec::Functions qw(catfile); 

my ($mday, $mon, $year) = (localtime)[3 .. 5]; 

my $filename = catfile(
    sprintf('PLAYLIST_TABLE_%02d', $mon + 1), 
    sprintf('%02d', $mday), 
    sprintf('%04d.txt', $year + 1900) 
); 

print $filename, "\n"; 

выход (на Windows):

 
PLAYLIST_TABLE_11\06\2009.txt 

Однако, я бы порекомендовал вам использовать:

my $filename = catfile(
    sprintf('%04d.txt', $year + 1900) 
    sprintf('PLAYLIST_TABLE_%02d', $mon + 1), 
    sprintf('%02d', $mday), 
); 

поэтому файлы журналов из задержек, близких по времени, остаются «закрытыми» в файловой системе.

Пожалуйста, избегайте иметь действительно длинные строки конкатенаций строк. Им очень сложно понять, что происходит с синтаксическими ошибками в скрытии. Вместо этого, вы можете использовать join:

join('/', 
    "PLAYLIST_TABLE_" . ($tm->mon + 1), 
    $tm->mday, 
    ($tm->year + 1900) . '.txt' 
); 
0

Вы забываете делать проверку на наличие ошибок, поэтому

use autodie; 

Мы все должны предпочесть ISO8601 отформатированные даты/времени :)

#!/usr/bin/perl -- 

use strict; 
use warnings; 

use File::Spec; 
use POSIX(); 

my $thisf = File::Spec->rel2abs(__FILE__); 
my $thisl = sprintf '%s-log-%s.txt', $thisf, POSIX::strftime(q!%Y-%m-%d-%H.%M.%SZ!,gmtime); 

print " 
thisf $thisf 
thisl $thisl 
"; 

__END__ 

$ perl tmp.pl 

thisf /home/boy/tmp.pl 
thisl /home/boy/tmp.pl-log-2009-11-08-20.35.38Z.txt 

$ 
Смежные вопросы