Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11785[/thread]

push zu arrayref (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
Struppi
 2008-05-11 11:19
#109559 #109559
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Mal wieder typisch Froschpopo oder Kuno (so nennt er sich im selfhtml Forum), einfach mal eine Frage auskotzen, ohne Sinn und Verstand und vor allem ohne irgendwelche infos, damit Hilfswillige überhaupt in der Lage wären zu helfen. Und das zieht sich wie ein roter Faden hier durch den Thread.

Er hat Probleme mit Referenzen auf Arrays.

Froschpopo+2008-05-10 20:16:36--
Nun will ich später eventuell außerhalb der while nochmal Elemente hinzufügen:
Code: (dl )
$param{SPORTART}->[$#$param{SPORTART}+1]->{DATUM} = 3;

Das ist totaler Unsinn, du kennst ja die Doku lies dich noch mal durch die der Listen und Referenzen.
KurtZ
 2008-05-11 16:39
#109578 #109578
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
seh ich ähnlich und >2500 Postings deuten auf Beratungsresistenz ... naja zumindest beschäftigt er die Neuzugänge hier. *fg*
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-05-12 01:39
#109598 #109598
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
[quote="DanielH+2008-05-10 17:42:20--"]
Und wenn sich das Array / der Hash selbst auch in 'ner Array- / Hash-Referenz befindet ist das Ganze sogar noch beschissener:

Code (perl): (dl )
1
2
3
4
5
#...
my $foo = { a => [1,2,3,4,5] };

push @{$foo->{a}}, 6,7,8,9;
print @{$foo->{a}}

[/quote]

Mal so ne Idee, wenn man's oft schreiben muss könnte man sich mit Wrappern behelfen, die dürften kaum Performance kosten
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub rpush  {
        push @{+shift},@_;
}

sub lst ($) {
        @{$_[0]}
}

sub rscalar ($) {
        scalar @{$_[0]};
}


my $foo = { a => [1,2,3,4,5] };

rpush $foo->{a} , 6,7,8,9;
print lst $foo->{a}, " restprint ...";
print rscalar $foo->{a};        


Schreibalternativen zu rpush, lst, rscalar wären auch Push, AT, Scalar [*] Vielleicht gibts ja sowas ähnliches schon bei CPAN... [*] edit: welche Konvention besser wäre müsste man diskutieren...
TMTOWTDYOG (there's more than one way to dig your own grave)
DanielH
 2008-05-12 20:00
#109626 #109626
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
KurtZ+2008-05-11 23:39:43--
Mal so ne Idee, wenn man's oft schreiben muss könnte man sich mit Wrappern behelfen, die dürften kaum Performance kosten


Stimmt, über so etwas hab ich noch gar nicht nachgedacht. Für mich würde im Prinzip "sub ARef { @{$_[0]} }" und "sub HRef { %{$_[0]} }" bereits ausreichen. Leider kann man allerdings HRef nicht mit 'keys' und 'values' benutzen (was ich oft verwende).


KurtZ+2008-05-11 23:39:43--
Vielleicht gibts ja sowas ähnliches schon bei CPAN...


Ich hab mal nachgeschaut, allerdings leider nichts gefunden.


Ein source Filter sollte noch eine andere Möglichkeit sein. Da sollte es auch performance-technisch die geringste Verluste geben (wenn das Script länger als 0,2 Sekunden läuft). Allerdings habe ich noch nie was mit source Filtern gemacht, und kenne nicht die Nachteile, die so etwas mitbringt (abgesehen von den offensichtlichen).



Quote
>2500 Postings


Darüber hab' ich mich auch schon gewundert (auch über sein Anmelde-Datum hier im Forum, aber vor allem über das alles in Kombination mit den Fragen, die er hier stellt bzw. wie er sie stellt ;) )
Struppi
 2008-05-12 23:10
#109633 #109633
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Deine HRef Funktion könntest zumindest mit den keys so verwenden:

Code (perl): (dl )
1
2
3
4
5
sub HRef { wantarray ? keys %{$_[0]} : %{$_[0]} };
 my $href = { qw(a 1 b 2) };
 foreach( HRef $href){
 print "$_\n";
 }
KurtZ
 2008-05-14 05:59
#109669 #109669
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
DanielH+2008-05-12 18:00:04--
Stimmt, über so etwas hab ich noch gar nicht nachgedacht. Für mich würde im Prinzip "sub ARef { @{$_[0]} }" und "sub HRef { %{$_[0]} }" bereits ausreichen. Leider kann man allerdings HRef nicht mit 'keys' und 'values' benutzen (was ich oft verwende).


Ja, die Builtins verlangen, das ein Array dasteht und nicht eine Funktion. Das ist auch nicht das einzige Problem wenn man sich @{ } sparen will. Z.B. kann man sowas auch nicht abbilden, @{$ar1} =@{$ar2} weil hier die linke Seite einen Listenkontext erzwingt.

Was man aber zumindest machen kann ist die Builtins so zu überschreiben dass sie wahlweise ein Array oder einen Scalar (für die Referenz) schlucken.

DanielH+2008-05-12 18:00:04--
Ein source Filter sollte noch eine andere Möglichkeit sein. Da sollte es auch performance-technisch die geringste Verluste geben (wenn das Script länger als 0,2 Sekunden läuft). Allerdings habe ich noch nie was mit source Filtern gemacht, und kenne nicht die Nachteile, die so etwas mitbringt (abgesehen von den offensichtlichen).


neben den offensichtlichen Problemen gibt es noch das allergrößte: Perlsyntax lässt sich nicht statisch parsen, und das muss man können um die schließende Klammer von @{ } korrekt setzen zu können.

Wo eine derefrenziertes Array von Arrays aufhört klärt sich unter Umständen erst zur Laufzeit, d.h. wenn der Sourcefilter schon lange durchgelaufen ist.
TMTOWTDYOG (there's more than one way to dig your own grave)
topeg
 2008-05-14 09:28
#109671 #109671
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So ähnlich könnte man es doch auch machen:
Code (perl): (dl )
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package HashRef;

sub new
{
 my $class=shift;
 my $ref=shift || {};
 $ref=ref($ref) eq 'HASH'? $ref : {};
 my $self={ref=>$ref);
 $self->{cnt}=0;
 bless($self,$class);
 return $self;
}

sub unref
{
 my $self=shift;
 $self->{cnt}=0;
 return(%{$self->{ref}});
}

sub ref
{
 my $self=shift;
 $self->{cnt}=0;
 if(@_ && ref($[0]) eq 'HASH')
 { $ref{ref} }
 else
 { return $self->{ref} }
}

sub keys
{
 my $self=shift;
 $self->{cnt}=0;
 return(keys(%{$self->{ref}}));
}

sub each
{
 my $self=shift;
 my @l=%{$self->{ref}};
 @l=splice(@l,$self->{ref},2);
 $self->{ref}+=2;
 return @l;
}

sub get
{
 my $self=shift;
 my $key=shift;
 return $sef->{ref]->{$key};
}

sub set
{
 my $self=shift;
 my $key=shift;
 my $value=shift;
 $sef->{ref]->{$key}=$value;
}

sub exists
{
 my $self=shift;
 my $key=shift;
 return exists($sef->{ref]->{$key});
}

sub type
{ return 'HASH'; }

1;
KurtZ
 2008-05-14 13:32
#109684 #109684
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
die Routinen müssten aber Prototypes haben ...
TMTOWTDYOG (there's more than one way to dig your own grave)
renee
 2008-05-14 13:50
#109685 #109685
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum kein 'Tie' dafür nehmen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
KurtZ
 2008-05-14 14:08
#109686 #109686
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
renee+2008-05-14 11:50:45--
Warum kein 'Tie' dafür nehmen?


du willst Array-Referenzen so tieen dass sie sich bei Zugriffen nach außen wie Arrays verhalten?

EDIT: Sorry ich begreife jetzt erst das topeg hier ne eigene Klasse baut... dann sind Tie's wahrscheinlich besser, aber was hilft es bei verschachtelten Strukturen man will doch nicht Referenzen blessen oder tie'n...

wenn man den Weg gehen will sollte man sich IMHO CPAN:autobox anschauen.

NACHTRAG: und es gibt ein fertiges Modul CPAN:autobox::Core
Code (perl): (dl )
$foo{bar}{baz}->push(42);
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



View all threads created 2008-05-10 16:42.