2010-03-29 5 views
0

J'ai créé un fichier argument.pl qui prend plusieurs arguments dont le premier devrait être sous la forme d'une année Par exemple: 2010 23 type. Ici 2010 est une annéeComment identifier un argument comme une année en Perl?

mon code fait quelque chose comme:

use strict; 
use warning 
use Date::Calc qw(:all); 
my ($startyear, $startmonth, $startday) = Today(); 
my $weekofyear = (Week_of_Year ($startyear,$startmonth,$startday))[0]; 
my $Year = $startyear; 
... 
... 

if ($ARGV[0]) 
{ 
$Year = $ARGV[0]; 
} 

Ici ce code remplit $Year avec « année courante » si $ARGV[0] est nul ou n'existe pas. Que dois-je utiliser ici au lieu de if ($ARGV[0])?

Est-il possible de vérifier que la valeur dans $ARGV[0] est une année valide (comme 2010, 1976,1999 etc.)?

+6

Il n'y a pas de bonne réponse à cette question. Tout nombre entier sauf 0 est une année valide dans le calendrier grégorien/julien. Ce que vous voulez probablement, c'est savoir si cette année est dans une certaine fourchette. –

+0

Pour fournir une bonne vérification, vous devez ajouter des informations spécifiques au domaine. Quelles plages d'années sont valables pour votre problème? Est-ce que cela doit être dans un certain calendrier, ou voulez-vous autoriser les calendriers hébreu, musulman ou chinois? Autrement dit, une année valide est exactement ce que vous dites. –

Répondre

1

simple test-ness format défini et 4 chiffres:

$Year = $ARGV[0] if defined $ARGV[0] && $ARGV[0] =~ /^\d{4}$/); 
+2

mais cela passe n'importe quel chiffre à 4 chiffres. – ghostdog74

+0

Tout nombre à quatre chiffres est une année valide. Il en va de même des numéros 1, 2, 3, 5, 6, 7 et 8 chiffres. Certains calendriers sont un peu plus anciens que les calendriers grégorien ou julien. :) –

2

Vous pouvez essayer ce qui suit pour vous assurer que le premier argument est au format 19xx ou 20xx.

if ($ARGV[0] =~/^(19|20)\d{2}$/) { 
$Year = $ARGV[0]; 
} 
+0

Donc, peu après y2k, nous oublions tout ce que nous avons appris. –

0

faire un essai, de trouver l'année est de 20 ** ou 19 **

if ($ARGV[0] =~ m!^((?:19|20)\d\d)) { 
$year = $ARGV[0]; 
} 

J'espère que cela t'aides.

+1

Ce n'est pas bon pour la Magna Carta. :( –

+1

Ou tout simplement utiliser 2 chiffres pour les 2 derniers chiffres de l'année.Que pourrait aller mal? – DVK

3

@OP, puisque vous utilisez Date :: Calc, regardant la documentation, vous voudrez peut-être essayer d'utiliser certaines des fonctions telles que check_date() par exemple

check_date 
     if (check_date($year,$month,$day)) 

si votre année est incorrect, la La fonction devrait vous donner une erreur.

+0

dans ce cas, l'utilisateur entrera seulement l'année, pouvez-vous s'il vous plaît élaborer sur la façon d'utiliser la méthode ci-dessus, comme: si (check_date ($ year)) ......... donne une erreur si – dexter

+0

si vous voulez seulement vérifier l'année, une façon est de donner à '$ month' et' $ day' une valeur fixe. la documentation pour voir s'il y a des options pour vérifier seulement l'année. – ghostdog74

3

Je recommande amerrissage arguments de position et en utilisant une bibliothèque de traitement d'arguments de ligne de commande tels que Getopt::Long afin que votre programme peut être appelé comme

$ argument.pl -y 2013 -d 23 -t type
Questions connexes