2009-02-22 16 views
6

Modyfikuję istniejący skrypt w Xcode, aby dostosować moje nagłówki plików. Skrypt to Perl i nie jest to moje najlepsze dzieło. :)Jak formatować daty w Perlu?

Po prostu wstawiam bieżącą datę do nagłówka w formacie dd/mm/yy.

Oto mój skrypt:

#! /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; 

Właśnie zmodyfikowano polecenie drukowania, więc nie pytajcie mnie do reszty kodu :)

Odpowiedz

19

Zamiast usuwania strict (!), Dlaczego po prostu nie wyczyścić kodu strict?

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

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

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

Może nawet lepiej (ponieważ bardziej zaznajomieni poszukuje kogoś, kto poprosił pod względem Bash):

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

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

Zabawny zbieg okoliczności: Perl Training Australia publikuje semi-regular tips (można je dostać za pośrednictwem poczty elektronicznej lub w Internecie), a dziś jest a new one na strftime.

+0

Strftime POSIX-a jest poprawnym sposobem formatowania dat ... tego lub innej klasy, aby to zrobić, np. Date :: Manip. – Powerlord

+0

Data :: Manip jest bardzo potężny, ale wiele jego cech ma wysoką wydajność. Pesonally, ja zwykle używam pierwszego przykładu tutaj. – spoulson

+0

@spoulson: Tak, dokumentacja Date :: Manip zawiera całą sekcję wyjaśniającą, dlaczego zazwyczaj nie potrzebujesz/nie chcesz Date :: Manip. Generalnie wykorzystuję strftime POSIX-a, ponieważ automagicznie zajmuje się szczegółami, które inaczej mogłem zapomnieć lub zepsuć (dodać 1 na miesiąc, 1900 do lat). – Telemachus

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

powinno wystarczyć.

Edit:

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

Będzie dbać o dopełnienie zerami też.

+0

to Gaves mi błąd: „Globalny symbol«$ s»wymaga wyraźnej nazwa pakietu "widzisz ten punkt? – claf

+0

wprowadzono kilka zmian w kodzie. Ale wydaje się, że działa dla mnie bez błędu, który otrzymujesz. –

+0

spróbuj usunąć używać strict; –

9

Można również użyć DateTime i powiązanych modułów, co jest oczywiście całkowitym przeskokiem dla małego skryptu takiego jak ten. Ale w przypadku większej aplikacji powinieneś używać solidnych modułów, zamiast robić wszystko na dłuższą metę. Dla przypomnienia, z DateTime chcesz napisać:

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

Albo można użyć bardziej nowoczesnego języka formatowania CLDR:

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