2009-02-22 34 views
6

Tôi đang sửa đổi tập lệnh có sẵn trong Xcode để tùy chỉnh tiêu đề tệp của mình. Kịch bản là Perl và nó không phải là ngôn ngữ tốt nhất của tôi. :)Làm cách nào để định dạng ngày trong Perl?

Tôi chỉ cần chèn ngày hiện tại vào tiêu đề ở định dạng dd/mm/yy.

Đây là kịch bản của tôi:

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

Tôi vừa mới sửa đổi lệnh in vì vậy đừng hỏi tôi cho phần còn lại của mã :)

Trả lời

19

Thay vì xóa strict (!), Tại sao không chỉ làm cho mã strict sạch?

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

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

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

Thậm chí có thể tốt hơn (vì quen thuộc hơn tìm cách để ai đó hỏi về Bash):

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

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

trùng hợp ngẫu nhiên vui: Perl Training Australia công bố bán thường xuyên tips (bạn có thể nhận được chúng qua email hoặc trực tuyến), và chỉ hôm nay có a new one trên strftime.

+0

Strftime của POSIX là cách chính xác để định dạng ngày ... đó hoặc một lớp khác để làm điều đó, như Date :: Manip. – Powerlord

+0

Date :: Manip rất mạnh, nhưng nhiều tính năng của nó có hiệu suất cao. Về cơ bản, tôi thường sử dụng ví dụ đầu tiên ở đây. – spoulson

+0

@spoulson: Yup, ngày tháng :: Tài liệu hướng dẫn Manip có toàn bộ phần giải thích lý do tại sao bạn thường không cần/muốn Date :: Manip. Tôi thường sử dụng strftime POSIX vì nó automagically chăm sóc của các chi tiết mà tôi có thể nếu không quên hoặc mess up (thêm 1 đến tháng, 1900 đến năm). – Telemachus

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

nên làm điều đó.

Edit:

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

sẽ chăm sóc phần đệm với zero quá.

+0

nó gaves tôi một số lỗi: "biểu tượng toàn cầu '$ giây' đòi hỏi rõ ràng tên gói "bạn có thấy điểm không? – claf

+0

đã thực hiện một vài thay đổi đối với mã. Nhưng có vẻ là làm việc cho tôi mà không có lỗi bạn đang nhận được. –

+0

thử xóa sử dụng nghiêm ngặt; –

9

Bạn cũng có thể sử dụng DateTime và các mô-đun liên quan, tất nhiên là quá mức cần thiết cho một tập lệnh nhỏ như thế này. Nhưng đối với một ứng dụng lớn hơn, bạn nên sử dụng các mô-đun vững chắc hơn là làm mọi thứ theo cách dài. Đối với hồ sơ, với DateTime bạn muốn viết:

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

Hoặc bạn có thể sử dụng các ngôn ngữ hiện đại hơn định dạng CLDR:

DateTime->today->format_cldr('dd/MM/YYYY'); 
Các vấn đề liên quan