1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/usr/bin/perl use strict; use warnings; my %in_out = ( foo => 'bar', ); $in_out{foot}{bart} = sub { return "subsub"; }; my %test2 = ( insub => sub { my ($get2) = @_; my $resp = $get2->{foot}->bart(); say $resp; }, ); $test2{insub}->(\%in_out);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#!/usr/bin/perl use strict; use warnings; use 5.010; my %in_out = ( foo => 'bar', ); $in_out{foot}{bart} = sub { return "subsub"; }; my %test2 = ( insub => sub { my ($get2) = @_; # es existiert keine benannte Subroutine bart() in der Hash-Struktur # 'bart' ist ein Schlüssel innerhalb der Hash-Struktur; und eine Code-Referenz wird per ->() aufgelöst my $resp = $get2->{foot}->{bart}->(); say $resp; }, ); $test2{insub}->(\%in_out);
2019-09-28T15:27:16 LinuxerWenn Du die falsche Syntax beibehalten willst, wirst Du den Fehler behalten müssen.
2019-09-28T15:06:46 biancaFrage: was bedeutet jetzt hier genau der Fehler Can't call method "bart" on unblessed reference at test_bless.pl line 16. und wie behebe ich ihn, ohne die Syntax in $test2{insub} zu ändern?
Danke!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# das da einbauen vor dem Aufruf bless $in_out{foot},'main'; sub AUTOLOAD{ my $self = shift; # parse den Namen der Funktion my $name = do{ our $AUTOLOAD =~ /::(\w+)/; $1; }; my $code = $self->{$name}; return $code->(@_); } sub DESTROY{}; # hack end # # Dein Funktionsaufruf $test2{insub}->(\%in_out);
2019-09-28T20:33:22 hlubenowBeides und ich dachte, dass das in Perl untrennbar zusammenhängt.verstehen wie OOP funktioniert (2) oder die Details von bless() begreifen (3)?
2019-09-28T22:00:14 biancaAb und zu kopiere ich mir solch einen Abschnitt in die "Werkstatt", um es zu warten. Und dort ist die Schnittstelle kein WWW::Mechanize Objekt sondern ich möchte dort ein eigenes Objekt erzeugen, dass das WWW::Mechanize Objekt quasi simuliert.
2019-09-28T22:00:14 bianca2019-09-28T20:33:22 hlubenowverstehen wie OOP funktioniert (2) oder die Details von bless() begreifen (3)?
Beides und ich dachte, dass das in Perl untrennbar zusammenhängt.
ich möchte dort ein eigenes Objekt erzeugen, dass das WWW::Mechanize Objekt quasi simuliert.
Daher und insbesondere weil ich endlich dieses oop mal lernen muss, möchte ich ein solches eigenes Objekt mit den 3 genannten Methoden bauen.
1 2 3 4 5 6 7 8 9 10
sub puts{ use bytes; local $, = "\n"; local $\ = "\n"; print @_; } my $m = bless{}; # eine Instanz der aktuellen package my $code = $m->can('puts'); $code->(1,2,3); # Ausgabe 1 2 3
2019-09-28T18:29:27 biancaDas ist doch komplexer als ich dachte. Danke dir dafür und ich muss mir das viel später nochmal genauer anschauen. Auch ob ich das endgültig so lösen will.
2019-09-29T05:42:49 rostiSo ist ein Perlobjekt nur eine Referenz die den Namen seiner Klasse kennt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use strict; use warnings; sub insert{ my $self = shift; my $dbh = shift; my $tabn = shift; my %hunt = @_; my @fields = keys %hunt; $dbh->do(qq( INSERT INTO @{[$dbh->quote_identifier($tabn)]} (@{[join ',', map{$dbh->quote_identifier($_)}@fields]}) VALUES( @{[join ',', map{$dbh->quote($_)}@hunt{@fields}]} ) )); } 1;
1 2 3 4 5
use insert; # Factorymethode einbinden # Objektattrappe erstellen my $mock = bless{}; # Factorymethode aufrufen $mock->insert($dbh, 'kette', zeichen => pack "U", 0x20AC);
QuotePerlobjekte können sehr umfangreich sein.
$person = Personen->new( name => 'foo', vname => 'bar');
$person->set( ort => 'Woanders', plz => '12345' );
$age = $person->age();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#!/usr/bin/perl use warnings; use strict; package Person { sub new { my $classname = shift; my $args = {@_}; my $self = { name => $args->{vname} || "", name => $args->{name} || "", ort => $args->{ort} || "", plz => $args->{plz} || "00000", age => $args->{age} || 0 }; return bless($self, $classname); } sub setLocation { my $self = shift; my %args = @_; $self->{plz} = $args{plz}; $self->{location} = $args{location}; } sub setAge { my $self = shift; my $age = shift; $self->{age} = $age; } sub getAge { my $self = shift; return $self->{age}; } } my $person = Person->new( name => 'foo', vname => 'bar'); # Nun kann die Person an einen anderen Ort umziehen und nimmt dazu einen sog. setter: $person->setLocation( ort => 'Woanders', plz => '12345' ); # Und wer wissen will wie alt er ist, nimmmt einen getter: $person->setAge(25); my $age = $person->getAge(); print "$age\n";
rostiSie enthalten die Daten mit denen die Klasse arbeitet. So kennen die Daten ihre Klasse und die Funktionen (Methoden) die sie aufrufen. Und für den Programmierer ist alles schön beeinander, package, Klasse, Namespace, Dateiname -- das ist alles Eins.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
sub location { my $self = shit; my @opts = @_; if (scalar @opts) { ### Aufruf ist ein Setter ; Wauf, Wuff!!! if (scalar @opts % 2) { # nur ok wenn Paare von Attribut und Wert! $self->{plz} = $opts{plz}; $self->{location} = $opts{location}; return $self; } else { warn "Usage location BLAH BLAH BLUBB"; # Meckern weil falscher Aufruf return undef; # Fehler } } else { ### Aufruf ist wohl David Getter ;) return $self; } }
tied(%person)->write(); # Daten persistent machen
2019-09-30T14:00:41 GwenDragonWarum trennst du in setter und getter?
GwenDragonCode (perl): (dl )my $self = shit;
2019-09-30T14:00:41 GwenDragonWarum trennst du in setter und getter?
...
Oder was meint ihr?
QuoteAllein das kann man schon als ausreichenden Anlaß für die Trennung durchgehen lassen, da er noch einige Argumente dafür anführt.Provide separate read and write accessors.
$person->location(location => 'vorne links')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
use 5.020; package Sphere; sub new { my $class = shift; my $self = { location => { x => 1, y => 2, z => 3 }, radius => 100, }; bless $self,$class; } sub get_location { my $self = shift; return $self->{location}{shift()}; } package main; my $sphere = Sphere->new; my $y = get_location('y'); say $y;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
use FastEAV; my $dal = FastEAV->new( file => "d:/tmp/personen") or die $@; # neue Person anlegen my $id = $dal->lfdnr; $dal->checkin($id, name => 'Otto', vname => 'Hans'); my $p = $dal->checkout(12); $p->{ort} = 'Adorf', $p->{plz} = 12345; $dal->checkin(12, %$p); # Daten sichern $dal->write;
2019-10-01T16:43:48 hlubenowWenn man öfter in dieser Syntax schreibt, merkt man, daß es auf Befehle nach dem Muster "Anrede, tue etwas [mit etwas]" hinausläuft.
Also z.B.: "$spieler->nimmLampe();" oder "$spieler->wirfBall();".
Fast ein bißchen wie "$Alexa->nenneDieUhrzeit();".
$obj->method()
2019-09-30T09:39:22 rostiGenauso isses. Vor allem ist Perl weniger pragmatisch wie bspw. java.
2019-09-30T11:55:43 haj2019-09-30T09:39:22 rostiGenauso isses. Vor allem ist Perl weniger pragmatisch wie bspw. java.
Das soll vermutlich heißen: Vor allem ist Perl weniger dogmatisch wie bspw. java.?
2019-09-30T13:05:28 rostiJava in 21 Tagen, haha.
2019-09-30T08:43:15 MuffiAnsonsten braucht auch jedes andere Objekt jeder anderen (mir bekannten Sprache) einen Zeiger auf den Code und einen Zeiger auf die Daten.
2019-09-30T08:43:15 MuffiAnsonsten braucht auch jedes andere Objekt jeder anderen (mir bekannten Sprache) einen Zeiger auf den Code und einen Zeiger auf die Daten.
struct MyClass { char c; };
2019-10-01T06:53:38 MuffiNaja, wenn du ein Objekt hast und rufst in der Klasse die Methode do_something auf. Dann brauchst du einen Zeiger auf den Code (also wo liegt das do_something - oder besser wo liegt meine Klasse + Offset für do_something)
QuoteAnsonsten braucht auch jedes andere Objekt jeder anderen (mir bekannten Sprache) einen Zeiger auf den Code und einen Zeiger auf die Daten.
1 2 3 4 5 6
my $ref = bless \%ENV; say $ref->path(); sub path{ my $self = shift; return $self->{PATH}; }