Schrift
[thread]11425[/thread]

wie testen ob leeres Array definiert wurde? (Seite 2)

Leser: 4


<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
Gast Gast
 2008-03-08 07:30
#106827 #106827
Das kann schon interessant sein.
Beispiel:
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
my @liste;

sub lade_liste {
  my $pfad=shift;
  my @l;
  if(open (my $fh, '<', $pfad)) {
    @l=<$fh>;
    close($fh);
  }
  return @l;
}

@liste=lade_liste('Test.txt');
if(defined(@liste)) {
  if(scalar(@liste)) {
    # mach was
  }
  else { warn "Datei war leer, kann nicht weiter machen!" }
}
else { warn "Datei konnte nicht geladen werden ($!)" }

# usw usf
styx-cc
 2008-03-08 07:55
#106828 #106828
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Also laut meinem Test kommt es aufs gleiche Raus:
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
#!/usr/bin/perl -w
use strict;

my @liste;
@liste = lade_liste($ARGV[0]);

if(defined($liste[0])) {
  if(scalar(@liste)) {
    print "mach was\n";
  }
  else { 
    warn "Datei war leer, kann nicht weiter machen!" 
  }
} else { 
  warn "Datei konnte nicht geladen werden ($!)" 
}

sub lade_liste {
  my $pfad = shift;
  my @l;
  if (open my $fh, '<', $pfad) {
    @l=<$fh>;
    close $fh;
  }
  return @l;
}


Und hier 2 Aufrufe + Ausgabe, "test.txt" (leere Datei) gibt es, "test 2.txt" nicht:
Code: (dl )
1
2
3
4
5
6
7
8
9
community$ perl defined_array.pl test.txt
defined(@array) is deprecated at defined_array.pl line 7.
(Maybe you should just omit the defined()?)
Datei konnte nicht geladen werden () at defined_array.pl line 15.

community$ perl defined_array.pl test2.txt
defined(@array) is deprecated at defined_array.pl line 7.
(Maybe you should just omit the defined()?)
Datei konnte nicht geladen werden (No such file or directory) at defined_array.pl line 15.

Theoretischerweise haette der Interpreter ja den else-zweig ausfuehren muessen und "Datei war leer, kann nicht weiter machen!" ausgeben muessen...

Also scheint defined lediglich zu pruefen, ob ein Skalar Daten enthaelt oder nicht, und damit ist dann ein if(scalar @array) sozusagen das defined unter den Arrays.
Moege man mich verbessern =)

edit: thema leicht verfehlt
Pörl.
pq
 2008-03-08 14:20
#106829 #106829
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
Gast+2008-03-08 06:30:37--
Das kann schon interessant sein.
Beispiel:
[...]

ach ich weiss nicht, wieso nimmst du da nicht gleich referenzen. ein u.U. langes array
durch die gegend zu kopieren ist eh nicht das beste, was man machen kann.
ausserdem ist es schlechter stil, erst in einem anderen block darauf zu reagieren, dass eine
datei nicht geöffnet werden konnte. das macht man bitteschön gleich danach, zumal $! beim
nächsten system-aufruf schon verändert werden könnte.

also: natürlich sehe ich in dem beispiel einen unterschied, aber das sieht für mich echt
konstruiert aus. ich habe sowas in 10 jahren perl noch nie gebraucht - das heisst zwar nicht
zwangsläufig, dass es auch niemand anderes braucht, aber ich geb ja hier nur meine meinung wieder.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
KurtZ
 2008-03-08 17:31
#106831 #106831
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Gast+2008-03-08 05:55:58--
Code: (dl )
my @array; #undefiniertes array

Code: (dl )
1
2
my @array; #undefiniertes array
@array = (); #jetzt ein leeres array

Habe ich das so richtig verstanden? Wenn ja, wozu moechtest du da noch testen koennen ob es undefiniert ist oder keine Elemente enthaelt?
Leer ist doch leer, oder?


leider nicht ganz, weil Perl wie gesagt auch noch für ein leeres Array keinen Speicher anlegt, aber mit
Code: (dl )
1
2
my @array; #undefiniertes array
( @array = ('dummy') )=(); #jetzt ein leeres definiertes array


kannst du den Unterschied mit defined abfragen.

Obige Schreibweise könnte ich auch noch akzeptieren, aber mich mit den ständigen Warnings das defined @arr deprecated ist, hätte ich schwierigkeiten.

das ist unorthogonal, wozu gibts ein undef @arr wenns kein defined @arr geben darf (deprecated)?


Gast+2008-03-08 06:30:37--
Code (perl): (dl )
@liste=lade_liste('Test.txt');


glaube nicht dass das so klappt, @liste bleibt ja auch undefined wenn das Return eine leere Liste ist.

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
use strict;
use Data::Dumper;

my @arr;

sub undef_arr {
        my @arr;
        return @arr;
}

sub empty_arr {
        my @arr=("");
        @arr=();
        return @arr;
}

@arr=undef_arr();

print "defined" if (defined @arr); #: nicht defined
print Dumper \@arr;

@arr=empty_arr();

print "defined" if (defined @arr); #: nicht defined
print Dumper \@arr      



pq hat schon recht dass du in Perl eh meistens auf Refs ausweichen musst !!!

pq+2008-03-08 13:20:45--
ach ich weiss nicht, wieso nimmst du da nicht gleich referenzen. ein u.U. langes array
durch die gegend zu kopieren ist eh nicht das beste, was man machen kann.


da geb ich dir (leider) voll recht, ich bin sogar soweit zu glauben mann solle grundsätzlich mit Arr_refs und Hash_refs arbeiten und den Editor so konfigurieren dass er defaultmäßig ein @ sofort zu @$ expandiert.


pq+2008-03-08 13:20:45--

also: natürlich sehe ich in dem beispiel einen unterschied, aber das sieht für mich echt
konstruiert aus. ich habe sowas in 10 jahren perl noch nie gebraucht - das heisst zwar nicht
zwangsläufig, dass es auch niemand anderes braucht, aber ich geb ja hier nur meine meinung wieder.


Hmm ... es gibt ein englisches Zitat das ich leider nicht mehr googeln kann, da heißt es emacs und perl-experten haben eine große Gemeinsamkeit, wenn sie sich erstmal mühsam eingearbeitet haben, dann geht ihnen das Verständnis für Anfängerprobleme flöten.

IMHO birgt jede Unorthogonalität den Samen zu unendlichem Ärger.

Die organische Wachstumsgeschichte von Perl bringt auch viele Vorteile, wie z.B.
das riesige CPAN, das will ich hier auch nicht abstreiten. Mein Anliegen ist mir
ein stylistisches "rechtwinkliges Koordinatensystem" für dieses Gebäudesystem zurechtzulegen, sodass ich schnell durch die vielen angebauten inhomogenen Räume navigieren kann ohne mir eine Latte von zu meidenden Sonderfällen merken zu müssen (diese Tür ist tiefer also ducken, jener Boden glitschig also Schuhe wechseln usw)


Hört mal, was ich nur zu verstehen versuche ist:

wieso ist defined @array deprecated???


PS: cut&paste zw. firefox und emacs frißt Umlaute, sorry!

EDIT hab jetzt mal händisch sonderzeichen eingefügt.
TMTOWTDYOG (there's more than one way to dig your own grave)
betterworld
 2008-03-08 17:42
#106832 #106832
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Ich dachte eigentlich immer, dass die beiden das gleiche tun:
Code (perl): (dl )
1
2
my @array;
my @array = ();


Ich schreibe jedenfalls immer das erste, weil es kuerzer ist. Es erzeugt nach meinem Verstaendnis einfach ein leeres Array, nix undefiniert oder so.

Es gibt hoechstens "undeklarierte" Arrays, also solche, die mit keinen der beiden obigen Schreibweisen erzeugt wurden. Aber in dem Fall darf ich unter strict auch nicht mehr defined @array schreiben, weil @array eben undeklariert ist.

Ich denke wie pq: Du solltest eine Arrayreferenz nehmen, da ist es klar, was defined bedeutet.

GwenDragon+2008-03-07 15:32:04--
Was hindert dich bitte daran, einfach
if(scalar @Array)
oder if ($#Array>-1) zu schreiben?

Ist für Perlschreibfaule sogar kürzer als defined ;)

Warum nicht gleich if (@array)? Sollte doch auch das gleiche tun, und wenn Du so schreibfaul bist... ;)
Linuxer
 2008-03-08 17:45
#106833 #106833
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Auf Basis der Ueberlegung, seinen Editor umzukonfigurieren, so dass er @ durch @$ ersetzt, koennte man ihn ja auch umkonfigurieren, dass er Umlaute durch deren Umschreibung ersetzt ;o))

SCNR (war schon irgendwo schmerzhaft, den Text ohne Umlaute zu lesen)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
KurtZ
 2008-03-08 17:55
#106834 #106834
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Linuxer+2008-03-08 16:45:45--
Auf Basis der Ueberlegung, seinen Editor umzukonfigurieren, so dass er @ durch @$ ersetzt, koennte man ihn ja auch umkonfigurieren, dass er Umlaute durch deren Umschreibung ersetzt ;o))
SCNR (war schon irgendwo schmerzhaft, den Text ohne Umlaute zu lesen)


Theoretisch ja, praktisch sieht die Umschreibung in emacs so aus:
ü entspricht ^[%/1iso8859-15^Bü

also ich müsste mit elisp zwo Transformroutinen basteln, oder nach Unicodefeaturen suchen.

@ -> @$ hingegen geht einfach mit autoexpand.

Trotzdem sorry, bei Gelegenheit repariere ichs. :-)

NACHTRAG: ich kann in emacs eine selektierte Region auch an ein perlscript pipen
und mit dem Output ersetzen... wenns läuft poste ichs hier.

NACHTRAG2: Es kann auch am Cut&Paste-verhalten meines Debian liegen, ich weiß nicht wer hier schlampt... FF, Debian oder Emacs.
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-03-08 18:02
#106835 #106835
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-03-08 16:42:13--
Ich dachte eigentlich immer, dass die beiden das gleiche tun:
Code (perl): (dl )
1
2
my @array;
my @array = ();


JA die tun (IMHO leider) absolut das gleiche (undefined) , im Gegensatz zu

Code (perl): (dl )
1
2
my @array=("belege Speicher");
@array = ();


jetzt ist es defined.

und wenn du später folgendes schreibst

Code (perl): (dl )
undef @array 


ist es wieder undefined.
bin ich den der einzige der das unorthogonal findet?

[quote=""betterworld+2008-03-08 16:42:13--"]
Warum nicht gleich if (@array)? Sollte doch auch das gleiche tun, und wenn Du so schreibfaul bist... ;)
[/quote]

ACK, IMHO ist es tatsächlich indentisch!
TMTOWTDYOG (there's more than one way to dig your own grave)
betterworld
 2008-03-08 18:06
#106836 #106836
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Linuxer+2008-03-08 16:45:45--
Auf Basis der Ueberlegung, seinen Editor umzukonfigurieren, so dass er @ durch @$ ersetzt, koennte man ihn ja auch umkonfigurieren, dass er Umlaute durch deren Umschreibung ersetzt ;o))

SCNR (war schon irgendwo schmerzhaft, den Text ohne Umlaute zu lesen)


Meinst Du jetzt mich?

Ich finde es immerhin nicht so schmerzhaft, wie einen Text mit Umlauten in komischen Kodierungen zu lesen ;)
KurtZ
 2008-03-08 18:16
#106837 #106837
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
KurtZ+2008-03-08 16:55:23--
NACHTRAG2: Es kann auch am Cut&Paste-verhalten meines Debian liegen, ich weiß nicht wer hier schlampt... FF, Debian oder Emacs.


OK scheinbar Xemacs! VIM hat keine Probleme ...

Grüße
ein VI-verächter

EDIT: hmm GNU-Emacs hat auch keine Probleme (paste 'äöü).
Xemacs ich fürchte deine Tage sind gezählt...
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



View all threads created 2008-03-06 23:58.