Schrift
[thread]12835[/thread]

Syntax-Problem mit Hash

Leser: 1


<< >> 7 Einträge, 1 Seite
tschloss
 2008-11-27 16:42
#116666 #116666
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Vermutlich ein Anfänger-Problem, aber ich kann es alleine nicht lösen.

Ich habe zwei Codeschnipsel, die ich für bedeutungsglich hielt. Bei einem kommt ein Fehler aus der aufgerufenen Methode zurück, beim anderen nicht.

Ok:
Code (perl): (dl )
1
2
$res2 = $sforce->update(
        'type'=>'Opportunity', 'id'=>'0063000000xxRLnAAN', 'closedate'=>'2003-12-12');


/edit: Is this really an anonymous hash or is this just a series of 6 literal string values as a normal parameter list?? Or ist presentation internally the same (can't beleive it).

Nicht ok:
Code (perl): (dl )
1
2
3
4
5
my %opp;
$opp{"type"} = "Opportunity";
$opp{"id"} = '0063000000xxRLnAAN';
$opp{"closedate"}="2013-12-12"; 
$res2 = $sforce->update(%opp); 

Fehler:
Code: (dl )
"expected a hash with key 'type' as first argument at ...<zeile mit 'update'>"


(Die Methode stammt aus dem Modul WWW::Salesforce::Simple)

Danke für Hinweise!

VG Thomas
MatthiasW
 2008-11-27 17:51
#116667 #116667
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
tschloss+2008-11-27 15:42:09--
/edit: Is this really an anonymous hash or is this just a series of 6 literal string values as a normal parameter list?? Or ist presentation internally the same (can't beleive it).

Lediglich 6 Strings.

Um die Reihenfolge wie von dem Modul verlangt beizubehalten, kannst du folgendes verwenden:
Code (perl): (dl )
$res2 = $sforce->update( map{$_=>$opp{$_}}qw/type id closedate/ );

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Gast Gast
 2008-11-27 20:20
#116668 #116668
Sowas:
Code (perl): (dl )
('A', 1, 'B', 2, 'C', 3, 'D', 4)
ist eine Liste.
Genauso das:
Code (perl): (dl )
('A' => 1, 'B' => 2, 'C' => 3, 'D' => 4)

Wie die Liste Später interpretiert wird hängt davon ab, wohin sie übergeben wird.
In einer Liste können die Trenner "... => ... ," oder "... , ... ," sein.
Wenn man sie an ein Array übergibt:
Code (perl): (dl )
1
2
@array=('A', 1, 'B', 2, 'C', 3, 'D', 4);
@array=('A' => 1, 'B' => 2, 'C' => 3, 'D' => 4);

wird aus der Liste erst ein Array.
Gleiches gilt für einen Hash:
Code (perl): (dl )
1
2
%hash=('A', 1, 'B', 2, 'C', 3, 'D', 4);
%hash=('A' => 1, 'B' => 2, 'C' => 3, 'D' => 4);

Wenn du eine Liste an eine Funktion übergibst wird sie in "@_" gepackt also zu einem Array.
tschloss
 2008-11-27 23:46
#116670 #116670
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Vielen Dank! Immerhin lag ich dann ja richtig.

Nur strange, dass eine "benachbarte" Methode dieses Moduls, nämlich "->create" mit einem vorher ausgefüllten Hash problemlos funktioniert. Und in einem O'Reily-Artikel (http://www.oreillynet.com/pub/a/network/2006/11/27...) wird "create" und "update" auch in der gleichen Art benutzt.
Eine Doku für diese Methoden habe ich nicht mal gefunden, aber im mitgelieferten Test-Skript verwendet der Autor diese Hash-ähnlich dargestellte Parameter-Liste.

Kann man aus dem Gesagten schließen, dass das Modul eine bestimmte Reihenfolge erwartet? Ich hoffe nicht, denn die Entity Opportunity hat mindestens 30 Felder. Erst type, dann Id ist ja noch irgendwie kanonisch, aber dann wird es zufällig, zumal nur die zu veränderten Felder mitzugeben sind.

Danke
Thomas

PS: Ich fühle mich in Perl mit den Referenzen und call-by-value vs. call-by-ref immer nich nicht wohl. Füher habe ich viel mit C programmiert, da was das alles immer sehr explizit. Jedenfalls scheint Perl das ein wenig anders handzuhaben und die Syntax bei verschachtelten/verketteten Strukturen geht mir nicht leicht von der Hand.
Gast Gast
 2008-11-28 06:30
#116675 #116675
ich habe mir gerade das Modul angesehen und wie es scheint funktioniert das so auch:
Code (perl): (dl )
...->update(type => 'xxx', { restliche => Wertepaare, ...})

Bei "create" erwartet er diese Reihenfolge nicht.

Bei "update" kann es funktionieren, muss aber nicht, das ist vom Zufall abhängig (wie der Hash im Speicher steht). Das ist einerseits ein Fehler im Artikel und andererseits schlechtes Design im Modul.
scriptor
 2008-11-28 12:19
#116679 #116679
User since
2008-05-07
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
tschloss+2008-11-27 22:46:42--
PS: Ich fühle mich in Perl mit den Referenzen und call-by-value vs. call-by-ref immer nich nicht wohl. Füher habe ich viel mit C programmiert, da was das alles immer sehr explizit. Jedenfalls scheint Perl das ein wenig anders handzuhaben und die Syntax bei verschachtelten/verketteten Strukturen geht mir nicht leicht von der Hand.


War auch für mich ein großes Problem, weil ich gleich mit tief geschachtelten Hashes anfing. Legt sich schnell! :-)
tschloss
 2008-11-28 12:43
#116680 #116680
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Gast+2008-11-28 05:30:24--
ich habe mir gerade das Modul angesehen und wie es scheint funktioniert das so auch:
Code (perl): (dl )
...->update(type => 'xxx', { restliche => Wertepaare, ...})

Bei "create" erwartet er diese Reihenfolge nicht.

Bei "update" kann es funktionieren, muss aber nicht, das ist vom Zufall abhängig (wie der Hash im Speicher steht). Das ist einerseits ein Fehler im Artikel und andererseits schlechtes Design im Modul.


Supi, danke für Deine Extra-Mühe!

VG Thomas
<< >> 7 Einträge, 1 Seite



View all threads created 2008-11-27 16:42.