Qual è il modo più semplice o più efficace per convertire l'abbreviazione del mese in un numero in Perl? (ad es. & # 8220; jan & # 8221; a 1)
-
04-07-2019 - |
Domanda
Se importassi una libreria per usare un metodo, ne varrebbe la pena? L'importazione richiede molta memoria?
Soluzione
preso in prestito da qui
%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
);
e per recuperare
$mon2num{"jan"}
Altri suggerimenti
Ecco ancora un altro modo per farlo:
my %month; @month{qw/jan feb mar apr may jun
jul aug sep oct nov dec/} = (1 .. 12);
L'importazione di un tale modulo non costa probabilmente tanta memoria a cui dovresti astenervi, anche se in questo caso probabilmente un hash semplice sarebbe altrettanto buono. Qualcosa come
my %number_for = (
jan => 1,
feb => 2,
#etc...
);
#...
do_something_with($number_for{$month})
my %month_num = do { my $i = 1; map {; my %month_num;
$month_num{ my %month_num = do { my $i = 1; map {; my %month_num = do {
my @month = qw( jan feb mar apr may jun jul aug sep oct nov dec );
zip2( 1 .. 1+$#month, @month );
};
O forse:
<*>
O usando una funzione zip :
<*> => $i++ } (
qw( jan feb mar apr may jun jul aug sep oct nov dec )
) };
O forse:
<*>
O usando una funzione zip :
<*> } = 1 + keys %month_num for (
qw( jan feb mar apr may jun jul aug sep oct nov dec )
);
O forse:
<*>
O usando una funzione zip :
<*> => $i++ } (
qw( jan feb mar apr may jun jul aug sep oct nov dec )
) };
O forse:
<*>O usando una funzione zip :
<*>Hmm - sembrano esserci molti modi eccessivamente complicati per farlo. Per qualcosa questa semplice chiarezza è la chiave:
# 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.";
Nota anche che le chiavi hash fanno distinzione tra maiuscole e minuscole; a seconda di dove provengono le tue abbreviazioni, potresti voler prima minare per abbinare le chiavi hash.
%mon_2_num = (jan => 1,
feb => 2,
...);
$month_number = $mon_2_num{lc($month_name_abbrev)};
Un altro modo per farlo usando una sezione hash:
@month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = 1..12;
Dipende da quanta manipolazione della data intendi fare. All'inizio probabilmente stai meglio facendo rotolare a mano, ad esempio
my @months = qw(Jan Feb Mar Apr May Jun
Jul Aug Sep Oct Nov Dec);
my %monthnum = map { Dipende da quanta manipolazione della data intendi fare. All'inizio probabilmente stai meglio facendo rotolare a mano, ad esempio
<*>
(Preferisco questo approccio perché è relativamente ovvio quello che stai facendo: hai un elenco di mesi, quindi li mappa da 1..12 (i numeri che hanno un senso per un essere umano) a 0..11 ( i numeri che hanno senso per un computer.) I colli di bottiglia delle prestazioni nel tuo codice non saranno in questo tipo di codice, saranno in rete, database o codice di accesso al disco, quindi concentrati sul rendere leggibile il tuo codice. )
Quando inizi ad aggiungere al tuo codice, potresti scoprire che molte di queste cose sono già fatte da moduli esistenti e potrebbe essere più facile fare alcune delle cose semplici con es. Date :: Calc. Oppure potresti trovare un modulo data / ora più adatto alle tue esigenze; questo va oltre lo scopo di questa domanda.
Tieni presente anche che alcuni moduli utilizzano l'autosplit, dove vengono caricate solo quelle parti del modulo necessarie. Inoltre, il principale impatto sulle prestazioni dell'utilizzo di un modulo di grandi dimensioni non è necessariamente la RAM, è probabilmente più probabile che sia il sovraccarico di tempo / CPU del caricamento e della compilazione prima che uno qualsiasi del codice sia mai stato eseguito.
=> $months[ Dipende da quanta manipolazione della data intendi fare. All'inizio probabilmente stai meglio facendo rotolare a mano, ad esempio
<*>
(Preferisco questo approccio perché è relativamente ovvio quello che stai facendo: hai un elenco di mesi, quindi li mappa da 1..12 (i numeri che hanno un senso per un essere umano) a 0..11 ( i numeri che hanno senso per un computer.) I colli di bottiglia delle prestazioni nel tuo codice non saranno in questo tipo di codice, saranno in rete, database o codice di accesso al disco, quindi concentrati sul rendere leggibile il tuo codice. )
Quando inizi ad aggiungere al tuo codice, potresti scoprire che molte di queste cose sono già fatte da moduli esistenti e potrebbe essere più facile fare alcune delle cose semplici con es. Date :: Calc. Oppure potresti trovare un modulo data / ora più adatto alle tue esigenze; questo va oltre lo scopo di questa domanda.
Tieni presente anche che alcuni moduli utilizzano l'autosplit, dove vengono caricate solo quelle parti del modulo necessarie. Inoltre, il principale impatto sulle prestazioni dell'utilizzo di un modulo di grandi dimensioni non è necessariamente la RAM, è probabilmente più probabile che sia il sovraccarico di tempo / CPU del caricamento e della compilazione prima che uno qualsiasi del codice sia mai stato eseguito.
- 1 ] } 1..12;
(Preferisco questo approccio perché è relativamente ovvio quello che stai facendo: hai un elenco di mesi, quindi li mappa da 1..12 (i numeri che hanno un senso per un essere umano) a 0..11 ( i numeri che hanno senso per un computer.) I colli di bottiglia delle prestazioni nel tuo codice non saranno in questo tipo di codice, saranno in rete, database o codice di accesso al disco, quindi concentrati sul rendere leggibile il tuo codice. )
Quando inizi ad aggiungere al tuo codice, potresti scoprire che molte di queste cose sono già fatte da moduli esistenti e potrebbe essere più facile fare alcune delle cose semplici con es. Date :: Calc. Oppure potresti trovare un modulo data / ora più adatto alle tue esigenze; questo va oltre lo scopo di questa domanda.
Tieni presente anche che alcuni moduli utilizzano l'autosplit, dove vengono caricate solo quelle parti del modulo necessarie. Inoltre, il principale impatto sulle prestazioni dell'utilizzo di un modulo di grandi dimensioni non è necessariamente la RAM, è probabilmente più probabile che sia il sovraccarico di tempo / CPU del caricamento e della compilazione prima che uno qualsiasi del codice sia mai stato eseguito.
Sicuramente un hash, come suggerito da altri.