2009-02-22 9 views
6

Je suis en train de modifier un script préexistant dans Xcode pour personnaliser mes en-têtes de fichiers. Le script est Perl et ce n'est pas ma meilleure langue. :)Comment formater des dates en Perl?

J'ai juste besoin d'insérer la date actuelle dans l'en-tête au format jj/mm/aa.

Voici mon 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; 

Je viens modifié la commande d'impression alors ne me demandez pas pour le reste du code :)

Répondre

19

Plutôt que de supprimer strict (!), Pourquoi ne pas simplement nettoyer le code strict?

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

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

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

Peut-être encore mieux (depuis plus familier à la recherche d'une personne qui a demandé en termes de Bash):

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

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

Drôle de coïncidence: Perl Training Australia publie tips semi-régulière (vous pouvez obtenir par courriel ou en ligne), et juste aujourd'hui il y a a new one sur strftime.

+0

strftime de POSIX est la bonne façon de formater des dates ... cela ou une autre classe pour le faire, comme Date :: Manip. – Powerlord

+0

Date: Manip est très puissant, mais beaucoup de ses fonctionnalités ont des performances élevées. Pesonally, j'utilise normalement le premier exemple ici. – spoulson

+0

@spoulson: Oui, la documentation Date :: Manip elle-même contient une section entière expliquant pourquoi vous n'avez généralement pas besoin de/want Date :: Manip. J'utilise généralement strftime de POSIX car il s'occupe automagiquement des détails que je pourrais sinon oublier ou gâcher (ajouter 1 au mois, 1900 à des années). – Telemachus

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

devrait le faire.

Edit:

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

prendra soin du rembourrage avec des zéros aussi.

+0

il me gaves une erreur: « symbole mondial « s de $ » exige explicitement nom du paquet "voyez-vous le point? – claf

+0

fait quelques modifications au code. Mais semble travailler pour moi sans l'erreur que vous obtenez. –

+0

essayez de supprimer use strict; –

9

Vous pouvez également utiliser DateTime et des modules connexes, ce qui est bien sûr complet pour un petit script comme celui-ci. Mais pour une application plus grande, vous devriez utiliser des modules solides plutôt que de tout faire sur le long chemin. Pour l'enregistrement, avec DateTime vous écririez:

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

Ou vous pouvez utiliser le format CLDR plus moderne langue:

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