Quel est le moyen le plus simple ou le plus efficace de convertir l'abréviation d'un mois en un nombre en Perl? (c'est-à-dire que Jan & # 8221; à 1)

StackOverflow https://stackoverflow.com/questions/241579

  •  04-07-2019
  •  | 
  •  

Question

Si j'importe une bibliothèque pour utiliser une méthode, cela en vaudrait-il la peine? L'importation utilise-t-elle beaucoup de mémoire?

Était-ce utile?

La solution

emprunté à ici

%mon2num = qw(
    jan 1  feb 2  mar 3  apr 4  may 5  jun 6
    jul 7  aug 8  sep 9  oct 10 nov 11 dec 12
);

et pour récupérer

$mon2num{"jan"}

Autres conseils

Voici encore un autre moyen de le faire:

my %month; @month{qw/jan feb mar apr may jun
                     jul aug sep oct nov dec/} = (1 .. 12);

L'importation d'un tel module ne coûtera probablement pas autant de mémoire que vous devriez en éviter, bien que dans ce cas, un simple hachage serait tout aussi bien. Quelque chose comme

my %number_for = (
    jan => 1,
    feb => 2,
#etc...
);
#...
do_something_with($number_for{$month})

Hmm - il semble y avoir beaucoup de façons trop compliquées de faire cela. Pour quelque chose, cette clarté simple est la clé:

# create a lookup table of month abbreviations to month numbers
my %month_abbr_to_number_lkup = (
    jan => 1,
    feb => 2,
    mar => 3,
    apr => 4,
    may => 5,
    jun => 6,
    jul => 7,
    aug => 8,
    sep => 9,
    oct => 10,
    nov => 11,
    dec => 12,
);

# get the number for a month
my $number = $month_abbr_to_number_lkup{$abbr}
    || die "Could not convert month abbreviation '$abbr' to a number.";

Notez également que les clés de hachage sont sensibles à la casse; En fonction de la provenance de vos abréviations, vous voudrez peut-être les mettre en casse pour les faire correspondre aux touches de hachage.

%mon_2_num = (jan => 1,
              feb => 2,
              ...);

$month_number = $mon_2_num{lc($month_name_abbrev)};

Une autre façon de procéder consiste à utiliser une tranche de hachage:

@month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = 1..12;

Cela dépend du nombre de manipulations de date que vous avez l'intention de faire. Au début, vous feriez probablement mieux de le faire rouler à la main, par exemple

.
my @months = qw(Jan Feb Mar Apr May Jun
                Jul Aug Sep Oct Nov Dec);
my %monthnum = map { 

Cela dépend du nombre de manipulations de date que vous avez l'intention de faire. Au début, vous feriez probablement mieux de le faire rouler à la main, par exemple

. <*>

(Je préfère cette approche car ce que vous faites est relativement évident: vous avez une liste de mois, puis vous les mappez de 1..12 (les chiffres qui ont un sens pour un humain) à 0..11 ( Les goulots d'étranglement des performances de votre code ne se trouveront pas dans ce type de code, ils se trouveront dans un code d'accès réseau, de base de données ou sur disque, concentrez-vous donc à rendre votre code lisible. )

Au fur et à mesure que vous commencez à ajouter du code, vous constaterez peut-être que bon nombre de ces tâches sont déjà effectuées par les modules existants, et il peut être plus facile de réaliser certaines tâches simples, par exemple. Date :: Calc. Ou vous pouvez trouver un module de date / heure plus adapté à vos besoins; cela dépasse le cadre de cette question.

Notez également que certains modules utilisent autosplit, où seules les parties du module nécessaires sont chargées. En outre, le principal impact de l'utilisation d'un module volumineux sur les performances n'est pas nécessairement la mémoire vive; il s'agit probablement davantage de la surcharge de temps et de temps processeur occasionné par son chargement et sa compilation avant que votre code ne soit exécuté.

=> $months[

Cela dépend du nombre de manipulations de date que vous avez l'intention de faire. Au début, vous feriez probablement mieux de le faire rouler à la main, par exemple

. <*>

(Je préfère cette approche car ce que vous faites est relativement évident: vous avez une liste de mois, puis vous les mappez de 1..12 (les chiffres qui ont un sens pour un humain) à 0..11 ( Les goulots d'étranglement des performances de votre code ne se trouveront pas dans ce type de code, ils se trouveront dans un code d'accès réseau, de base de données ou sur disque, concentrez-vous donc à rendre votre code lisible. )

Au fur et à mesure que vous commencez à ajouter du code, vous constaterez peut-être que bon nombre de ces tâches sont déjà effectuées par les modules existants, et il peut être plus facile de réaliser certaines tâches simples, par exemple. Date :: Calc. Ou vous pouvez trouver un module de date / heure plus adapté à vos besoins; cela dépasse le cadre de cette question.

Notez également que certains modules utilisent autosplit, où seules les parties du module nécessaires sont chargées. En outre, le principal impact de l'utilisation d'un module volumineux sur les performances n'est pas nécessairement la mémoire vive; il s'agit probablement davantage de la surcharge de temps et de temps processeur occasionné par son chargement et sa compilation avant que votre code ne soit exécuté.

- 1 ] } 1..12;

(Je préfère cette approche car ce que vous faites est relativement évident: vous avez une liste de mois, puis vous les mappez de 1..12 (les chiffres qui ont un sens pour un humain) à 0..11 ( Les goulots d'étranglement des performances de votre code ne se trouveront pas dans ce type de code, ils se trouveront dans un code d'accès réseau, de base de données ou sur disque, concentrez-vous donc à rendre votre code lisible. )

Au fur et à mesure que vous commencez à ajouter du code, vous constaterez peut-être que bon nombre de ces tâches sont déjà effectuées par les modules existants, et il peut être plus facile de réaliser certaines tâches simples, par exemple. Date :: Calc. Ou vous pouvez trouver un module de date / heure plus adapté à vos besoins; cela dépasse le cadre de cette question.

Notez également que certains modules utilisent autosplit, où seules les parties du module nécessaires sont chargées. En outre, le principal impact de l'utilisation d'un module volumineux sur les performances n'est pas nécessairement la mémoire vive; il s'agit probablement davantage de la surcharge de temps et de temps processeur occasionné par son chargement et sa compilation avant que votre code ne soit exécuté.

Certainement un hash, comme suggéré par d'autres.

scroll top