Using a hash as a reference is deprecated at ...
Using a hash as a reference is deprecated at ...
am 12.09.2006 08:50:58 von Reinhard Pagitsch
Hallo allerseits,
Ich habe nun meinPerl von 5.6.1 auf 5.8.8 (Activestate) upgedated.
Nun bekomm ich bei einem Modul die obige Meldung.
Ich mache folgendes (DB ist MS SQL Server):
my $h_data;
my $key;
my $exe="EXEC sp_columns \'ISIS_IDXAR\'";
my $sth = $dbh->prepare($exe) or die $dbh->errstr;
$sth->execute or die $dbh->errstr;
while($h_data = $sth->fetchrow_hashref()) {
foreach $key (keys %{$h_data})
{
if($key =~ /COLUMN_NAME/i) {
In der nächsten Zeile kommt die Meldung:
$colnames .= " ,i." . %{$h_data}->{$key};
}
}
}
$h_data _ist_ doch eine Referenz auf einen Hash, oder nicht?
Was mache ich hier falsch? Oder besser wie ist es richtig?
Danke,
Reinhard
--
PM replays nur an reinhard dot pagitsch at isis-papyrus dot com.
Die Adresse im From/Replay To wird nicht gelesen.
Re: Using a hash as a reference is deprecated at ...
am 12.09.2006 09:14:59 von Otto Lang
Reinhard Pagitsch wrote:
> Hallo allerseits,
>
> Ich habe nun meinPerl von 5.6.1 auf 5.8.8 (Activestate) upgedated.
> Nun bekomm ich bei einem Modul die obige Meldung.
> Ich mache folgendes (DB ist MS SQL Server):
>
> my $h_data;
> my $key;
> my $exe="EXEC sp_columns \'ISIS_IDXAR\'";
> my $sth = $dbh->prepare($exe) or die $dbh->errstr;
> $sth->execute or die $dbh->errstr;
> while($h_data = $sth->fetchrow_hashref()) {
> foreach $key (keys %{$h_data})
> {
> if($key =~ /COLUMN_NAME/i) {
> In der nächsten Zeile kommt die Meldung:
> $colnames .= " ,i." . %{$h_data}->{$key};
Hier ist der Fehler. Da sollte
$colnames .= " ,i." . $h_data->{$key};
stehen. Aber war das nicht auch schon vor v5.8.x mit einer Meldung
belegt?
> }
> }
> }
> $h_data _ist_ doch eine Referenz auf einen Hash, oder nicht?
> Was mache ich hier falsch? Oder besser wie ist es richtig?
Das ist schon richtig, nur deine Schreibweise war nicht korrekt.
> Danke,
> Reinhard
HTH
../otto
Re: Using a hash as a reference is deprecated at ...
am 12.09.2006 10:57:54 von Ingo Menger
Reinhard Pagitsch schrieb:
> Hallo allerseits,
>
> Ich habe nun meinPerl von 5.6.1 auf 5.8.8 (Activestate) upgedated.
> Nun bekomm ich bei einem Modul die obige Meldung.
> Ich mache folgendes (DB ist MS SQL Server):
>
> my $h_data;
> my $key;
> my $exe=3D"EXEC sp_columns \'ISIS_IDXAR\'";
> my $sth =3D $dbh->prepare($exe) or die $dbh->errstr;
> $sth->execute or die $dbh->errstr;
> while($h_data =3D $sth->fetchrow_hashref()) {
> foreach $key (keys %{$h_data})
> {
> if($key =3D~ /COLUMN_NAME/i) {
> In der nächsten Zeile kommt die Meldung:
> $colnames .=3D " ,i." . %{$h_data}->{$key};
> }
> }
> }
> $h_data _ist_ doch eine Referenz auf einen Hash, oder nicht?
> Was mache ich hier falsch? Oder besser wie ist es richtig?
$h_data - eine Hashreferenz
%{$h_data} - der Hash, der von $h_data referenziert wird, kann auch
%$hash geschrieben werden.
Jetzt siehst Du schon, was falsch ist. Der Operator -> arbeitet nicht
auf Hashs, sondern auf Referenzen auf Hashs.
Du schreibst ja auch nicht:
my %x =3D qw(foo 1 bar 42);
und dann
%x->{bar}
Deshalb kannst Du die ganze Klammerei sparen, denn Du hast ja eine
Hashreferenz:
$h_data->{$key}
Re: Using a hash as a reference is deprecated at ...
am 12.09.2006 10:58:29 von Reinhard Pagitsch
Otto Lang wrote:
> Reinhard Pagitsch wrote:
>> Hallo allerseits,
>>
>> Ich habe nun meinPerl von 5.6.1 auf 5.8.8 (Activestate) upgedated.
>> Nun bekomm ich bei einem Modul die obige Meldung.
>> Ich mache folgendes (DB ist MS SQL Server):
>>
>> my $h_data;
>> my $key;
>> my $exe="EXEC sp_columns \'ISIS_IDXAR\'";
>> my $sth = $dbh->prepare($exe) or die $dbh->errstr;
>> $sth->execute or die $dbh->errstr;
>> while($h_data = $sth->fetchrow_hashref()) {
>> foreach $key (keys %{$h_data})
>> {
>> if($key =~ /COLUMN_NAME/i) {
>> In der nächsten Zeile kommt die Meldung:
>> $colnames .= " ,i." . %{$h_data}->{$key};
>
> Hier ist der Fehler. Da sollte
>
> $colnames .= " ,i." . $h_data->{$key};
>
> stehen. Aber war das nicht auch schon vor v5.8.x mit einer Meldung
> belegt?
Kann ich nicht sagen. Unter v5.6.1 hat Perl jedenfalls _nicht_
gemeckert. Hat es unter dieser Version noch keine solche Überprüfung
gegeben?
Ich hab mir nochmal perlref und perlreftut vorgenommen. Da gibts ja
viele Möglichkeiten mit den (hash)Referenzen. Meines Erachtens ist das
sehr verwirrend. Na ich werd mir halt wohl diese Doku genauestens zu
Gemüte führen müssen.
Grüße,
Reinhard
>
>> }
>> }
>> }
>
>> $h_data _ist_ doch eine Referenz auf einen Hash, oder nicht?
>> Was mache ich hier falsch? Oder besser wie ist es richtig?
>
> Das ist schon richtig, nur deine Schreibweise war nicht korrekt.
>
>> Danke,
>> Reinhard
>
> HTH
> ./otto
--
PM replays nur an reinhard dot pagitsch at isis-papyrus dot com.
Die Adresse im From/Replay To wird nicht gelesen.