può contenere alcuni elementi che hanno un valore non definito , probabilmente perché una o più colonne del database che popolato @row
era NULL
. Il comportamento può essere imitato pur utilizzando join
in un semplice Perl-liner simili:
perl -we 'my @array = ("Hello",undef,"world!"); print join("|",@array) . "\n";'
l'uscita che produrrà è:
Use of uninitialized value $array[1] in join or string at -e line 1.
Hello||world!
la ragione per cui questo accade è perché join
sta cercando di unire un valore che non si stringa senza essere aggiornato da "non definito" a "definito". Stringendo undef
si genera questo messaggio di avviso per avvisare che si sta facendo qualcosa di non intenzionale e non corretto.
Un esempio ancora più semplice potrebbe essere questo:
$ perl -we 'my $scalar; print "$scalar\n";'
Use of uninitialized value $scalar in concatenation (.) or string at -e line 1.
Anche in questo caso, si ottiene l'avvertimento perché stiamo interpolando un valore indefinito in una stringa. L'interpolazione causa la stringificazione e la stringificazione di un valore indefinito genera generalmente un avvertimento per farti sapere che potresti aver fatto un errore.
Se non ti dispiace in silenzio l'aggiornamento delle undef
's su una stringa vuota, si potrebbe fare questo:
print FH join($delimiter, map { defined ? $_ : '' } @row) . "\n";
questo pre-processi @row
prima di consegnarlo a join()
. Per ogni elemento in @row
, se l'elemento ha un valore non definito, tale valore viene sostituito da una stringa vuota, che è definita ma visivamente silenziosa.
L'altra possibilità è che $delimiter
non è definito. Provalo per questo stampandolo, e se ciò si verifica, i passaggi che dovrai eseguire per risolverlo sono semplicemente assicurarti che contenga effettivamente un valore.
Basta mettere a tacere gli avvertimenti in un ambito lessicale stretto potrebbe essere ok, anche se da un punto di vista filosofico, un metodo rimuove la causa e l'altro rimuove uno dei sintomi. Il metodo "no warnings 'uninitialized';
descritto altrove fa proprio questo; silenzia l'avviso.Lo faresti quando sai che stai facendo qualcosa di perfettamente Ok, ma sai anche che Perl ti avviserà perché molte volte è un errore. Questa potrebbe essere una situazione del genere; si può essere perfettamente contenti semplicemente lasciando che la stringificazione silenziosa di un valore indefinito avvenga all'interno dello join
. E se è così, vai avanti e soffoca l'avvertimento. La cosa più importante è che tu sappia cosa significa, verifica cosa lo sta causando e poi prendi una decisione informata su cosa fare al riguardo.
come si presenta la query o il codice che ha generato la query? – SBH
Dimostra a te stesso che $ delimitatore ha un valore. Aggiungilo subito prima della stampa: 'print" delimiter >>> $ delimitatore <<< \ n ";' – toolic
Se dovessi indovinare, una delle colonne in '@ row' è' NULL'. – nandhp