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)

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

  •  04-07-2019
  •  | 
  •  

Domanda

Se importassi una libreria per usare un metodo, ne varrebbe la pena? L'importazione richiede molta memoria?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top