Come uso map () per applicare un'operazione a ciascun elemento di un hash in Perl?
-
05-07-2019 - |
Domanda
Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results->{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results->{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results->{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
map {
$results{ Ho un pezzo di codice che funziona bene. Fondamentalmente scorre attraverso ogni elemento di un hash usando foreach ()
e applica una trasformazione ad esso usando un'espressione regolare, in questo modo:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results è un hashref restituito dalla funzione fetchall_hashref ()
di DBI.
Appena per curiosità, volevo vedere se potevo riscriverlo usando invece map ()
, come mostrato sotto:
<*>
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s{".*/(.*\.*(gif|jpe?g|png))"}{/resources/uploads/$1}gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>
e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Sfortunatamente, non funziona. Ho provato di tutto, ma finora senza successo. Qualcuno sa come farlo? Grazie.
Aggiorna
Il codice corretto, come risposta da ysth :
<*>e la versione migliorata con meno stuzzicadenti pendenti suggeriti da Sinan & # 220; n & # 252 ; r
<*>Soluzione
Nella versione della mappa, hai erroneamente modificato $ results- > {
in $ results {
. Metti il ??- > di nuovo dentro e dovrebbe funzionare.
Altri suggerimenti
Vale la pena ricordare che potresti cavartela
Vale la pena ricordare che potresti cavartela
<*>
in questo caso. Frugare nella struttura dei dati non disturba i riferimenti che lo compongono.
->{uri} =~ s/foo/bar/ for values %$results;
in questo caso. Frugare nella struttura dei dati non disturba i riferimenti che lo compongono.
Il secondo pezzo di codice usa un hash ma il primo usa un riferimento hash. Il seguente sembra funzionare:
use warnings;
use strict;
my $results = {
a => {uri => "\"c/x.png\"" },
b => {uri => "\"d/y.jpeg\""}
};
map {
$results->{ Il secondo pezzo di codice usa un hash ma il primo usa un riferimento hash. Il seguente sembra funzionare:
<*>}{uri} =~
s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
for my $k (keys %$results) {
print "$k $results->{$k}{uri}\n";
}