Variablen - Unterschiede
Sascha
- perl
Hallo,
kann mir jemand sagen worin hier die Unterschiede liegen?
my $c1 = {};
my $c2 = '';
my $c3 = ();
Ich hab leider nicht die geringste Ahnung!
Viele Grüße,
Sascha
Hi Sascha,
dafür gibt es Manuals.
Hi chopin,
jetzt kenne ich noch immer nicht die Unterschiede!
Ob
$c1;
oder
$c1 = {};
der Effekt scheint mir der Gleiche.
Viele Grüße,
Sascha
kann mir jemand sagen worin hier die Unterschiede liegen?
my $c1 = {};
Anonyme Hash-Referenz.
my $c2 = '';
Leerer String.
my $c3 = ();
Undefinierter Wert (du expandierst durch diese Zuweisung eine leere Liste zu einem String, das gibt undef).
Hallo,
my $c1 = {};
Anonyme Hash-Referenz.
aber
$c1 = {};
ist doch das Gleiche wie
$c1;
denn in beiden Fällen funktioniert
$c1->{Begruessung} = "Hallo Anonymous!";
print "$c1->{Begruessung}\n";
und warum funktioniert
print "$c1{Begruessung}\n";
nicht?
my $c2 = '';
Leerer String.
Ok, leutet mir ein!
my $c3 = ();
Undefinierter Wert (du expandierst durch diese Zuweisung eine leere Liste zu einem String, das gibt undef).
aber dies ist doch auch wieder das Gleiche wie
$c3;
denn der Skalar ist zunächst undefiniert. Warum setzt man dann $c3=(); ?
Gruß,
Sascha
my $c1 = {};
Anonyme Hash-Referenz.
aber
$c1 = {};
ist doch das Gleiche wie
$c1;denn in beiden Fällen funktioniert
$c1->{Begruessung} = "Hallo Anonymous!";
print "$c1->{Begruessung}\n";
Das ist ein Trugschluss. Die zweite Variante funktioniert, weil der ->-Operator automatisch eine anonyme Hash-Referenz anlegt. Aber probiere es ruhig aus:
perl -MData::Dumper -Mstrict -e 'my $c1; my $c2 = {}; print Dumper $c1; print Dumper $c2;'
und warum funktioniert
print "$c1{Begruessung}\n";
nicht?
Weil sich das auf den Hash %c1 bezieht, der zwar in diesem Fall indirekt angelegt wird, aber der keinen Key "Begruessung" hat.
my $c3 = ();
Undefinierter Wert (du expandierst durch diese Zuweisung eine leere Liste zu einem String, das gibt undef).
aber dies ist doch auch wieder das Gleiche wie
$c3;
Das gleiche schon, aber nicht dasselbe.
denn der Skalar ist zunächst undefiniert. Warum setzt man dann $c3=(); ?
Tut man nicht, höchstens um Leute absichtlich zu verwirren.
Hallo,
Das ist ein Trugschluss. Die zweite Variante funktioniert, weil der ->-Operator automatisch eine anonyme Hash-Referenz anlegt. Aber probiere es ruhig aus:
ok
perl -MData::Dumper -Mstrict -e 'my $c1; my $c2 = {}; print Dumper $c1; print Dumper $c2;'
syntax error at ./hash.pl line 14, near "Mstrict -e "
Execution of ./hash.pl aborted due to compilation errors.
und warum funktioniert
print "$c1{Begruessung}\n";
nicht?
Weil sich das auf den Hash %c1 bezieht, der zwar in diesem Fall indirekt angelegt wird, aber der keinen Key "Begruessung" hat.
damit ich das richtig verstehe... %c1; ist ein gewöhnlicher hash und $c1={}; ist eine referenz auf eine anonyme hash tabelle?
was wäre dann für die folgende Struktur geeigneter?
Dateiinhalt:
begr=hallo
name=anonymous
while(<DATEI>) {
($a,$b)=split /=/,$_;
$hs->{$a}=$b; # diese Variante
$hs{$a}=$b; # oder diese
}
my $c3 = ();
Undefinierter Wert (du expandierst durch diese Zuweisung eine leere Liste zu einem String, das gibt undef).
aber dies ist doch auch wieder das Gleiche wie
$c3;Das gleiche schon, aber nicht dasselbe.
denn der Skalar ist zunächst undefiniert. Warum setzt man dann $c3=(); ?
Tut man nicht, höchstens um Leute absichtlich zu verwirren.
perl -MData::Dumper -Mstrict -e 'my $c1; my $c2 = {}; print Dumper $c1; print Dumper $c2;'
syntax error at ./hash.pl line 14, near "Mstrict -e "
Execution of ./hash.pl aborted due to compilation errors.
Das war ein Kommandozeilen-Befehl. In einem Script sähe das so aus:
use strict;
use Data::Dumper;
my $c1;
my $c2 = {};
print Dumper $c1;
print Dumper $c2;
und warum funktioniert
print "$c1{Begruessung}\n";
nicht?
Weil sich das auf den Hash %c1 bezieht, der zwar in diesem Fall indirekt angelegt wird, aber der keinen Key "Begruessung" hat.
damit ich das richtig verstehe... %c1; ist ein gewöhnlicher hash und $c1={}; ist eine referenz auf eine anonyme hash tabelle?
Ja.
was wäre dann für die folgende Struktur geeigneter?
[...]
Vermutlich die Hash-Referenz, weil da weniger kopiert werden muss.
Hallo Anonymous,
ich muss dich nochmal quälen ;-)
perl -MData::Dumper -Mstrict -e 'my $c1; my $c2 = {}; print Dumper $c1; print Dumper $c2;'
syntax error at ./hash.pl line 14, near "Mstrict -e "
Execution of ./hash.pl aborted due to compilation errors.Das war ein Kommandozeilen-Befehl.
oops :-)
#perl -MData::Dumper -Mstrict -e 'my $c1; my $c2 = {}; print Dumper $c1; print Dumper $c2;'
$VAR1 = undef;
$VAR1 = {};
thanks!
damit ich das richtig verstehe... %c1; ist ein gewöhnlicher hash und $c1={}; ist eine referenz auf eine anonyme hash tabelle?
Ja.
was wäre dann für die folgende Struktur geeigneter?
[...]Vermutlich die Hash-Referenz, weil da weniger kopiert werden muss.
Kannst du mir diese Aussage näher erläutern?
Mit Hash-Referenz meintest du jetzt die Anonyme oder die Normale? Denn beides ist doch irgendwie eine Referenz oder?
Warum findet die anonyme Hash-Referenz Anwendung, denn mit einem normalem Hash kann man doch auch referenzieren, oder nicht? Das habe ich noch nicht so ganz verstanden und in vielen Doku's wird zwar erklärt wie es funktioniert, aber nicht, welchen genauen Zweck bzw. welche Vorteile es bringt!
Gruß,
Sascha
was wäre dann für die folgende Struktur geeigneter?
[...]Vermutlich die Hash-Referenz, weil da weniger kopiert werden muss.
Kannst du mir diese Aussage näher erläutern?
Wenn du keine Referenz benutzt, muss der Hash bei return %hash kopiert werden. Bei einer Referenz ist das nicht nötig.
Mit Hash-Referenz meintest du jetzt die Anonyme oder die Normale? Denn beides ist doch irgendwie eine Referenz oder?
Beides sind Referenzen, ja. Welche der beiden Referenzen du benutzt ist irrelevant.
Warum findet die anonyme Hash-Referenz Anwendung,
Damit man nicht erst einen Hash erstellen muss:
%hash = ();
$ref = %hash;
Ist länger als
$ref = {};
Wenn du keine Referenz benutzt, muss der Hash bei return %hash kopiert werden. Bei einer Referenz ist das nicht nötig.
%hash = ();
$ref = %hash;Ist länger als
$ref = {};
aha! deshalb wäre es also besser in sub-funktionen mit referenzen zu arbeiten, damit hashes und arrays nicht kopiert werden müssen, was bei ein paar hunderten von mbs ziemlich unperformant wäre...
beispiel:
sub good {
my $ref={};
return $ref;
}
sub bad {
my %ref=();
return %ref;
}
ist das so richtig?
Warum findet die anonyme Hash-Referenz Anwendung, denn mit einem normalem Hash kann man doch auch referenzieren, oder nicht? Das habe ich noch nicht so ganz verstanden und in vielen Doku's wird zwar erklärt wie es funktioniert, aber nicht, welchen genauen Zweck bzw. welche Vorteile es bringt!
Es hat keine Vorteile, aber wenn du sowieso später z.b. in den Funktionen Referenzen benutzt ist es evtl. übersichtlicher, wenn du eine Schreibweise im ganzen Skript verwendest.
Struppi.
Hallo Struppi,
eine andere Frage habe ich noch.
Kann C++ wie Perl mit Arrays und Hashes umgehen? Soviel ich weiß kann C es nicht. Ist die Regexp in C++ genauso gut wie die in Perl?
Ich bin nämlich am überlegen, meine Skripts in C++ umzuschreiben um ein wenig mehr Speed rein zu bringen.
Ist C++ schwer?
Viele Grüße,
Sascha