2009-02-22 16 views
6

Sto modificando uno script preesistente in Xcode per personalizzare le intestazioni dei miei file. La sceneggiatura è Perl e non è la mia migliore lingua. :)Come posso formattare le date in Perl?

Ho solo bisogno di inserire la data corrente nell'intestazione in formato gg/mm/aa.

Ecco il mio script:

#! /usr/bin/perl -w 
# Insert HeaderDoc comment for a header 
# 
# Inserts a template HeaderDoc comment for the header. 
use strict; 

# get path to document 
my $headerPath = <<'HEADERPATH'; 
%%%{PBXFilePath}%%% 
HEADERPATH 
chomp $headerPath; 
my $rootFileName = &rootFileNameFromPath($headerPath); 

print "/*"; 
print " * $rootFileName\n"; 
print " * Project\n"; 
print " *\n"; 
print " * Created by Me on "; 
# in bash it would be something like that : 
# date +%d/%m/%y | awk '{printf "%s\n", $1}'; 
print " * Copyright 2009 My_companie. All rights reserved.\n"; 
print " *\n"; 
print " */\n"; 

sub rootFileNameFromPath { 
    my $path = shift; 

    my @pathParts = split (m'/', $path); 
    my $filename = pop (@pathParts); 
    my $rootFileName = "$filename"; 
    $rootFileName =~ s/\.h$//; 
    return $rootFileName; 
} 

exit 0; 

Ho appena modificato il comando di stampa in modo da non chiedetemi per il resto del codice :)

risposta

19

Piuttosto che rimuovere strict (!), Perché non basta rendere il codice strict pulito?

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

$mon += 1; 
$year += 1900; 

printf "%02d/%02d/%02d\n", $mday, $mon, $year % 100; 

forse anche meglio (dal più familiare alla ricerca di qualcuno che ha chiesto in termini di Bash):

# At the top, under use strict; 
use POSIX qw/strftime/; 

# then later... 
my $date = strftime "%d/%m/%y", localtime; 
print "$date\n"; 

coincidenza divertente: Perl Training Australia pubblica semi-regolare tips (si possono ottenere via e-mail o on-line), e proprio oggi c'è a new one su strftime.

+0

Lo strptime di POSIX è il modo corretto per formattare le date ... quella o un'altra classe per farlo, come Date :: Manip. – Powerlord

+0

Date :: Manip è molto potente, ma molte delle sue funzionalità hanno una penalizzazione ad alte prestazioni. Pesonalmente, di solito uso il primo esempio qui. – spoulson

+0

@spoulson: Sì, la documentazione Date :: Manip ha un'intera sezione che spiega perché in genere non è necessario/desidera Date :: Manip. Generalmente uso lo strftime di POSIX poiché si occupa automagicamente dei dettagli che altrimenti potrei dimenticare o rovinare (aggiungere 1 al mese, 1900 a anni). – Telemachus

2
@time = localtime(time); 
$mday = $time[3]; 
$mon = $time[4]+1; 
$year = $time[5]+1900; 
print "$mday/$mon/$year\n"; 

dovrebbe farlo.

Edit:

printf "%02d/%02d/%4d",$mday,$mon+1,$year+1900"; 

prenderemo cura di imbottiture con zeri troppo.

+0

mi gaves qualche errore: "simbolo globale '$ sec' richiede esplicita nome del pacchetto "capisci il punto? – claf

+0

ha apportato alcune modifiche al codice. Ma sembra funzionare per me senza l'errore che stai ricevendo. –

+0

provare a rimuovere usare rigorosamente; –

9

Si potrebbe anche utilizzare DateTime e moduli correlati, che è ovviamente completo per un piccolo script come questo. Ma per un'app più grande, dovresti utilizzare moduli solidi piuttosto che fare tutto alla lunga. Per la cronaca, con DateTime devi scrivere:

DateTime->today()->strftime('%d/%m/%y'); 

Oppure si potrebbe usare il più moderno linguaggio formato CLDR:

DateTime->today->format_cldr('dd/MM/YYYY'); 
Problemi correlati