2017-08-24 1 views
0

Ich versuche folgende Stück Code, insbesondere zu verstehen, was in Zeile 4, 5 und 6 geschiehtWie überprüft man Zeilen, die von der Methode fetchall_arrayref in Perl zurückgegeben werden?

ich das meiste davon verstanden haben, sondern kann einfach nicht scheinen zu verstehen, was mit @$r != 1; in Linie getan wird 4 (nicht @$r stellt die Anzahl der zurückgegebenen Zeilen?) und in ähnlicher Weise, was geschieht mit @$r[0] in Leitung 5 und @$rr[0] in Zeile 6:

1 my $sth = $dbh->prepare(" a select statement "); 
2 $sth->execute(); 
3 my $r = $sth->fetchall_arrayref(); 
4 die "Failed to select " if !defined($r) || @$r != 1; 
5 my $rr = @$r[0]; 
6 my $rec = @$rr[0]; 
7 print "Rec is $rec\n"; 

Antwort

3

Die fetchall_arrayref() gibt einen Verweis auf ein Array aller Zeilen zurück, in dem jedes Element auch ein Verweis auf ein Array mit den Elementen dieser Zeile ist.

Dann wird die die Zeilen überprüft

  1. , dass die Top-Level-Referenz $r definiert ist (dass der Anruf bearbeitet) und

  2. , dass die Größe des Arrays, @$r, genau 1 – also, dass das Array genau ein Element enthält. Dies verrät die Erwartung, dass die Abfrage eine Zeile zurückgeben wird, und da der Code auf die vorbereitet ist, kann es nach einer Zeile fragen, durch fetchrow_arrayref oder fetchrow_array.

Die @$r dereferenziert die $r ArrayRef und im skalaren Kontext von != auferlegt wir in der Tat die Anzahl der Elemente in der Liste bekommen.

Die Zeile 5 ist sehr irreführend, um es gelinde auszudrücken, auch wenn die Syntax legitim ist: Sie extrahiert das erste Element und füttert es in einen Skalar, verwendet aber @$r[0] Syntax, die normalerweise bedeuten würde, dass wir ein erhalten Liste, durch sein Sigil @. Es entspricht @{$r}[0] und ist ein Missbrauch der Notation.

Es sollte entweder eindeutig das erste Element erhalten, wenn das die Absicht

my $rr = $r->[0]; 

oder auch dereferenzieren das gesamte Array

my @row = @{ $r->[0] }; 

zu erhalten, wenn das gewollt ist.

Die letzte Zeile, die Sie abfragen, ist genau das gleiche, unter Verwendung der abgerufenen $rr Referenz. Aber das erste Element des ersten ArrayRef (row) leicht direkt

erhalten
my $rec = $r->[0]->[0]; # or $r->[0][0] 

was Linien ersetzt 5 und 6

Siehe perlreftut und perldsc.

3

auswerten eines Arrays (Referenz) in Skalarkontext gibt die Anzahl der Elemente in der Array. Die Antwort auf Ihre anderen Fragen ist, dass es sich nur um Standard-Dereferenzierung mit hässlicher Syntax und nutzlosen Zwischenvariablen handelt.

ich in der Lehre Menschen glauben, wie man Fisch, obwohl, so diesen Code prüfen, die im Wesentlichen das, was Sie gerade arbeiten:

use strict; 
use warnings; 

use Data::Dumper; 

my $r = [[1, 2, 3]]; 
my $rr = @$r[0]; 
my $rec = @$rr[0]; 

print Dumper($r, $rr, $rec); 

Ausgang:

$VAR1 = [ 
      [ 
      1, 
      2, 
      3 
      ] 
     ]; 
$VAR2 = $VAR1->[0]; 
$VAR3 = 1; 

Es sollte einfach sein um zu sehen, was gerade passiert, dass Sie sehen können, was jede Variable hält, richtig?

Verwandte Themen