2009-02-22 5 views
6

Ich modifiziere ein bereits existierendes Skript in Xcode, um meine Dateiheader anzupassen. Das Skript ist Perl und es ist nicht meine beste Sprache. :)Wie formatiere ich Datumsangaben in Perl?

Ich muss nur das aktuelle Datum in der Kopfzeile in TT/MM/JJ-Format einfügen.

Hier ist mein Skript:

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

Ich habe gerade den Druckbefehl geändert, so fragen Sie mich nicht für den Rest des Codes :)

Antwort

19

Anstatt strict (!) Zu entfernen, warum nicht einfach den Code strict sauber machen?

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

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

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

Vielleicht sogar besser (da vertraut jemand, der in Bezug auf den Bash gefragt):

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

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

Lustiger Zufall: Perl Training Australia veröffentlicht halb regelmäßig tips (Sie können sie per E-Mail erhalten oder online), und nur heute gibt es a new one auf strftime.

+0

POSIX's strftime ist die richtige Art Daten zu formatieren ... das oder eine andere Klasse, wie Date :: Manip. – Powerlord

+0

Datum :: Manip ist sehr mächtig, aber viele seiner Funktionen haben hohe Leistungseinbußen. Pesonisch verwende ich normalerweise das erste Beispiel hier. – spoulson

+0

@spoulson: Yup, die Date :: Manip-Dokumentation selbst hat einen ganzen Abschnitt, der erklärt, warum du Date :: Manip im Allgemeinen nicht brauchst/willst. Normalerweise benutze ich POSIX's strftime, da es sich automatisch um die Details kümmert, die ich sonst vergessen oder vermasseln könnte (addiere 1 zu Monat, 1900 zu Jahren). – Telemachus

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

sollte es tun.

Edit:

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

Wird die Polsterung sorgt auch mit Nullen.

+0

es mir einige Fehler gaves: „Globales Symbol‚$ s‘erfordert explizite Paketname "Siehst du den Punkt? – claf

+0

hat ein paar Änderungen am Code vorgenommen. Aber scheint für mich zu arbeiten, ohne den Fehler, den Sie bekommen. –

+0

versuchen zu entfernen verwenden Sie streng; –

9

Sie könnten auch DateTime und verwandte Module verwenden, was natürlich für ein kleines Skript wie dieses komplett übertrieben ist. Aber für eine größere App sollten Sie solide Module verwenden, anstatt alles auf lange Sicht zu tun. Für die Aufzeichnung mit Datetime Sie schreiben würden:

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

Oder Sie könnten die modernere CLDR Format Sprache verwenden:

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