Schrift
[thread]11456[/thread]

Eindeutige Liste aller Zeichen im String (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten
KurtZ
 2008-03-14 21:08
#107070 #107070
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
renee+2008-03-14 15:42:35--
Man bekommt mit der Zeit aber ein ziemlich gutes Gefühl dafür, was "wahr" und was "falsch" ist


Im Zweifelsfall - wenn man nicht genau kontrolliert welcher Scalarwert "geboolt" wird - will man wahrscheinlich auch eher ein defined oder einen expliziten Vergleich hinschreiben.

renee+2008-03-14 15:44:51--
Quote
Jetzt werde ich auch in Zukunft mehr den Befehl Data::Dumper benutzen, um in die Strukturen schauen zu können!
Das ist ein echt nützliches Modul!


Supernützlich, wobei mir aber eines aufgefallen ist, was ich anzumerken mir nicht verkneifen kann: *fg*

Dumper behandelt ein undefiniertes Array wie ein leeres Array statt sowas wie "undef" auszugeben.
TMTOWTDYOG (there's more than one way to dig your own grave)
sid burn
 2008-03-16 20:33
#107105 #107105
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Code (perl): (dl )
Dumper behandelt ein undefiniertes Array wie ein leeres Array statt sowas wie "undef" auszugeben.

Es gibt kein "undefiniertes" Array. Ein Array hat entweder Inhalte oder kein Inhalte ist also Leer.

Würde dort "undef" stehen hätte das Array einen Wert und hätte somit Inhalt. Dieser Wäre dann "undef". Die Ausgabe undef wäre also komplett falsch.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
KurtZ
 2008-03-16 21:08
#107107 #107107
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
ach ... und was macht
Code (perl): (dl )
undef @arr 

???
TMTOWTDYOG (there's more than one way to dig your own grave)
Gast Gast
 2008-03-16 21:48
#107108 #107108
Folgendes Code-Beispiel:
Code: (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
#!/usr/bin/perl

# PRAGMAS
# -------
use strict;
use warnings 'all';

# FORWARD DECLARATIONS
# --------------------
sub show_arr (\@);

# MAIN
# ----
my @arr = (); # leeres array erzeigen
show_arr @arr; # ausgabe

@arr = qw( inhalt inhalt2 ); # array befuellen
show_arr @arr; # ausgabe

undef @arr; # array "undefinieren"
show_arr @arr; # ausgabe

<STDIN>;

# SUBROUTINES
# -----------
#
# NAME: show_arr()
#
# DESCRIPTION:
# Output the elements of an array.
# If the array is empty, '()' will get written, if it is undefined,
# 'undef' will get written.
#
# PARAMETERS: 1. Perl Array
#
# RETURNS: nothing
#
sub show_arr (\@)
{
my @arr = @{$_[0]}; # pick array

print "SHOW_ARRAY: ".
( @arr ? ('( '. join( ', ', @arr ) .' )') # show array data if there is any
: ( defined @arr ? '()' # show () if array is empty
: 'undef' # show undef if array is undef
)
) ."\n";
} # show_arr

__END__

Wie's aussieht leert es den Array, denn zuerst wird undef, dann die Elemente und dann () ausgegeben.
Ich hätte es genau umgekehrt erwartet.

Aber hat das nicht genau mit dem Thread "wie testen ob leeres array definiert wurde" ( oder so ähnlich ) zu tun?

MfG
KurtZ
 2008-03-16 22:49
#107109 #107109
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Gast+2008-03-16 20:48:17--
Aber hat das nicht genau mit dem Thread "wie testen ob leeres array definiert wurde" ( oder so ähnlich ) zu tun?


genau, ich hatte den Thread verbrochen (und die "was macht dann undef" Frage war rethorisch, sorry)

aber du hast einen schön gegliederten Code abgeliefert, (eigentlich zu lang zum posten ;)

Dass kann doch nicht alles perltidy sein, odr?
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-03-16 22:54
#107110 #107110
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Gast+2008-03-16 20:48:17--
Wie's aussieht leert es den Array, denn zuerst wird undef, dann die Elemente und dann () ausgegeben.
Ich hätte es genau umgekehrt erwartet.


es ist IMHO definitiv umgekehrt, meines erachtens liegt das Problem in deinem Code:
an der Stelle
Code (perl): (dl )
my @arr = @{$_[0]};     # pick array 

kopierst du das übergebene Array um, statt ein alias zu machen.
Code (perl): (dl )
$arr = $_[0];     # pick array 


du überprüfst nämlich die Kopie
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-03-16 23:06
#107111 #107111
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
so funktionierts, man beachte die geänderte Reihenfolge, weil Perl sonst
bei einem leeren array erstmal keinen Speicher allokiert.

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
#!/usr/bin/perl

# PRAGMAS
# -------
use strict;
use warnings 'all';

# FORWARD DECLARATIONS
# --------------------
sub show_arr (\@);

# MAIN
# ----


my @arr = qw( inhalt inhalt2 ); # array befuellen
show_arr @arr;                  #: SHOW_ARRAY: ( inhalt, inhalt2 )

@arr = ();                      # leeres array erzeigen
show_arr @arr;                  #: SHOW_ARRAY: ()


undef    @arr;                  # array "undefinieren"
show_arr @arr;                  #: SHOW_ARRAY: undef

<STDIN>;

# SUBROUTINES
# -----------
#
# NAME:        show_arr()
#
# DESCRIPTION:
# Output the elements of an array.
# If the array is empty, '()' will get written, if it is undefined,
# 'undef' will get written.
#
# PARAMETERS:  1. Perl Array
#
# RETURNS:     nothing
#
sub show_arr (\@)
{
        my $arr = $_[0];     # pick array

        print "SHOW_ARRAY: ".
                ( @$arr ? ('( '. join( ', ', @$arr ) .' )')  # show array data if there is any
                       : ( defined @$arr ? '()'             # show () if array is empty
                                        : 'undef'          # show undef if array is undef
                         )
                ) ."\n";
} # show_arr

__END__


aber die Diskussion hatten wir bereits, brauchen wir nicht neu aufrollen...
TMTOWTDYOG (there's more than one way to dig your own grave)
sid burn
 2008-03-17 00:44
#107114 #107114
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
KurtZ+2008-03-16 20:08:13--
ach ... und was macht
Code (perl): (dl )
undef @arr 

???

Das gleiche was auch ein @array = () macht. Nämlich das Array Leeren.

Quote
Wie's aussieht leert es den Array, denn zuerst wird undef, dann die Elemente und dann () ausgegeben. Ich hätte es genau umgekehrt erwartet.

Das bei deinem Code
Code: (dl )
1
2
defined(@array) is deprecated at ./array.pl line 44.
(Maybe you should just omit the defined()?)

ausgegeben wird übersiehst du aber, oder? Das ganze wird nicht umsonst ausgegeben, den es macht kein Sinn ein Array auf definiert oder undefiniert zu testen. Da es eben keind efiniertes oder undefiniertes Array gibt. Es gibt entweder gefüllte oder Leere Arrays.

Was ein defined auf ein Array macht steht auch in perldoc -f defined:
Code: (dl )
Use of "defined" on aggregates (hashes and arrays) is deprecated.  It used to report whether memory for that aggregate has ever been allocated.  This behavior may disappear in future versions of Perl.  You should instead use a simple test for size:


Es testet nämlich einfach nur ob jemals schonmal Speicher für das Array alloziert wurde oder nicht. Das hat nichts damit zu tun ob ein Array definiert oder undefiniert sein kann. Es ist weiterhin einfach nur leer oder voll.

Und da es absolut kein Sinn macht ein array auf defined zu testen ist das ganze auch DEPRACED. Und ob schonmal jemals Speicher für das Array alloziert wurde ist genauso uninteressant.

Es gibt aber weiterhin keine definiert oder undefinierte Arrays, sie sind entweder leer oder voll. defined @ARRAY testet ob jemals Speicher alloziert wurde. Fertig.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pq
 2008-03-17 00:54
#107115 #107115
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
ich glaube, das haben wir genug durchgekaut, oder? ich denke, was defined() bei einem array
macht, ist KurtZ auch klar, was er aber anspricht, ist, was es seiner meinung nach tun sollte
und logisch wäre.
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-17 02:24
#107118 #107118
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
pq+2008-03-16 23:54:05--
ich glaube, das haben wir genug durchgekaut, oder?

Definitiv! sid burn scheint leider unsere Diskussion dazu nicht zu kennen. -> wie testen ob leeres Array definiert wurde?

Meine Anmerkung(!) zu Data::Dumper ging in Richtung Debugging. Die Info das ein Array nicht nur leer ist sondern auch nie angelegt wurde könnte entscheidend weiterhelfen. Außerdem ist undef @rray nicht deprecated.
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten



View all threads created 2008-03-11 18:39.