in_array in Perl?

in_array in Perl?

am 11.11.2006 15:25:05 von Rainer Hinz

Moin,

bin nicht so fit in Perl:

Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist=
?

Finde nichts...

Danke für Hilfe

Gruß
Anne

Re: in_array in Perl?

am 11.11.2006 15:39:23 von Frank Seitz

Anne Kappes wrote:

> bin nicht so fit in Perl:
>
> Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?
>
> Finde nichts...

Versuch's mal mit grep() oder einer foreach-Schleife.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: in_array in Perl?

am 11.11.2006 15:43:28 von Bjoern Hoehrmann

* Anne Kappes wrote in de.comp.lang.perl.misc:
>Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?

Dazu gibt es eine Reihe von Möglichkeiten,

% perldoc -q "element is contained"

listet die auf. Eine einfache Methode ist

my $is_there = grep $_ eq $whatever, @array;

wie dort beschrieben.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Re: in_array in Perl?

am 11.11.2006 15:55:24 von Wolf Behrenhoff

Anne Kappes schrieb:
> Moin,
>
> bin nicht so fit in Perl:
>
> Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?

Wenn du häufig in_array nutzen willst, solltest du überlegen, ob nicht
vielleicht ein Hash sinnvoller ist, da bei normalen Arrays das gesamte
Array durchlaufen werden muss, um herauszufinden, ob ein Wert
gespeichert ist.

In einem Hash kannst du mit exists prüfen, ob ein Schlüssel vorhanden
ist oder nicht.

Wolf

Re: in_array in Perl?

am 11.11.2006 15:56:00 von Stephan Grein

Anne Kappes wrote:
> Moin,
>
> bin nicht so fit in Perl:
>
> Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?
>
> Finde nichts...
Was soll in_arrray machen? Eventuell prüfen ob X ein Element im Array Y ist?
Falls ja:

Leserlich:
perl -e 'my $X = "a"; my @Y = ( "a", "b", "c"); map { $_ eq "$X" ?
print "Element \"$_\" ist im Array Y enthalten!\n" : "" } (@Y) '

Bisschen kürzer:
perl -e 'print sub { map { $_ eq $_[0] ? return 1 : return 0; } (qw/a b
c/) }->("a"); print $/'



>
> Danke für Hilfe
>

Eventuell gibt's auch ne built-in Funktion.
> Gruß
> Anne

Dito.

--
Stephan Grein,
https://stephan-rockt.de
GnuPG-Key-ID: 0xF8C275D4
FingerPrint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4

Re: in_array in Perl?

am 11.11.2006 15:57:47 von Stephan Grein

Das war nur bisschen gespielt, sorry!
Benutzte doch einfach grep!

http://perldoc.perl.org/ oder perldoc -f grep

HTH,
--
Stephan Grein,
https://stephan-rockt.de
GnuPG-Key-ID: 0xF8C275D4
FingerPrint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4

Re: in_array in Perl?

am 11.11.2006 16:03:29 von Frank Seitz

Wolf Behrenhoff wrote:
> Anne Kappes schrieb:
>>
>>bin nicht so fit in Perl:
>>
>>Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?
>
> Wenn du häufig in_array nutzen willst, solltest du überlegen, ob nicht
> vielleicht ein Hash sinnvoller ist, da bei normalen Arrays das gesamte
> Array durchlaufen werden muss, um herauszufinden, ob ein Wert
> gespeichert ist.

Im Mittel muss das halbe Array durchlaufen werden.

Im Normalfall ist es nicht sinnvoll, ein Array durch einen Hash
zu ersetzen, nur weil man obige Prüfung machen möchte, weil
das eine andere Datenstruktur mit teilweise deutlich anderen
Eigenschaften ist.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: in_array in Perl?

am 11.11.2006 23:27:18 von Wolf Behrenhoff

Frank Seitz schrieb:
> Wolf Behrenhoff wrote:
>> Anne Kappes schrieb:
>>> bin nicht so fit in Perl:
>>>
>>> Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?
>> Wenn du häufig in_array nutzen willst, solltest du überlegen, ob nicht
>> vielleicht ein Hash sinnvoller ist, da bei normalen Arrays das gesamte
>> Array durchlaufen werden muss, um herauszufinden, ob ein Wert
>> gespeichert ist.
>
> Im Mittel muss das halbe Array durchlaufen werden.

Das kommt darauf an. Wenn du Daten derart hast, dass in 50% der Fälle
überhaupt ein Eintrag drin ist, musst du im Mittel 3/4 des Arrays
durchlaufen. Wenn du weißt, dass in_array noch seltener wahr ist,
brauchst du im Mittel noch mehr. Dein Mittel gilt nur, wenn alle
Einträge drin sind.

> Im Normalfall ist es nicht sinnvoll, ein Array durch einen Hash
> zu ersetzen, nur weil man obige Prüfung machen möchte, weil
> das eine andere Datenstruktur mit teilweise deutlich anderen
> Eigenschaften ist.

Das ist natürlich richtig. Da ich das konkrete Problem nicht kenne und
in PHP Arrays und Hashes ja sehr ähnlich sind, wollte ich es nur einmal
angesprochen haben.

Wolf

Re: in_array in Perl?

am 12.11.2006 00:09:56 von Frank Seitz

Wolf Behrenhoff wrote:
> Frank Seitz schrieb:
>>
>>Im Mittel muss das halbe Array durchlaufen werden.
>
> Das kommt darauf an. Wenn du Daten derart hast, dass in 50% der Fälle
> überhaupt ein Eintrag drin ist, musst du im Mittel 3/4 des Arrays
> durchlaufen. Wenn du weißt, dass in_array noch seltener wahr ist,
> brauchst du im Mittel noch mehr. Dein Mittel gilt nur, wenn alle
> Einträge drin sind.

Ich bezog mich auf Deine Aussage:

"...da bei normalen Arrays das gesamte
Array durchlaufen werden muss, um herauszufinden, ob ein Wert
gespeichert ist."

Das ist offensichtlich nicht richtig für Werte, die
in dem Array vorkommen. Für die gilt obiges Mittel.
Du hast aber Recht für Werte, die in dem Array nicht vorkommen,
für die muss das Array ganz durchlaufen werden.
Deinem Argument oben stimme ich zu.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: in_array in Perl?

am 16.11.2006 10:58:09 von Mirco Wahab

Anne Kappes schrieb:

> bin nicht so fit in Perl:
> Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?
> Finde nichts...

Nein, sowas gibt es nicht. PHP ist ja
auch "moderner" als Perl, da muss es
schon über gute Funktionen verfügen.

Da es das nicht gibt, hab ich mal
sowas "inschenörsmässig" entworfen ;-)

Dazu muss man anmerken, dass es in
PHP gar keine "Arrays" im Sinne von
"implizt indizierten Vektoren" gibt(!).

Die Perl-Version eines PHP-Arrays
wäre demnach sowas:

my %phparr = ();

$phparr{'0'} = 'Das';
$phparr{'1'} = 'wird';
$phparr{'2'} = 'ein';
$phparr{'3'} = 'Php';
$phparr{'4'} = 'Array';

$phparr{'heute'} = 'Donnerstag';
$phparr{'morgen'} = 'Freitag';

Damit wird zwar nicht die gesamte
"Array"-Funktionalität in PHP
nachgebildet, aber doch schon
ein guter Teil.


Die besondere Funktionalität eines
PHP-Arrays bezüglich Deiner Frage
sähe dann so aus:

my %phparr = ();
sub in_array( $\% ); # <= ist das Element drin
sub pos_array( $\% ); # <= wo ist das Element zu finden

Wir ergänzen die Definition unseres
schönen PHP-Arrays durch die Vorwärts-
deklaration der Methoden, die wir
anwenden wollen (wir nehmen gleich
eine Methode dazu, die uns sagt, wo
das Element zu finden ist).

Jetzt können wir "PHP spielen":

...
print "Ist der Donnerstag drin?\n";

if( in_array('Donnerstag', %phparr) ) {
print "yo, bei: ", pos_array('Donnerstag', %phparr), "\n";
}
...


und unsere in_array-Methode anwenden.

Was fehlt noch? Ach so, wir müssen die Methoden
(Perl => Subroutinen) noch definieren; das machen
wir z.B. unter dem obigen Quelltext:


...
sub in_array( $\% ){
my ($value, $php_arr) = @_;
scalar grep $_ eq $value, values %$php_arr;
}

sub pos_array( $\% ) {
my ($value, $php_arr) = @_;
my @k = grep $php_arr->{$_} eq $value, keys %$php_arr;
wantarray ? @k : $k[0];
}
...



Man kann sich natürlich auch noch andere Methoden
ausdenken ...

Ich hoffe, dass mein nicht ganz ernst gemeinter
Beitrag zumindest ein wenig instruktiv war ;-)

Viele Grüße

Mirco

Re: in_array in Perl?

am 20.11.2006 16:11:08 von Robert Sedlacek

Anne Kappes wrote
> Moin,
>
> bin nicht so fit in Perl:
>
> Gibt es sowas wie ein in_array in Perl wie es bei Php gang und gäbe ist?

Die Hinweise auf 'grep' und eines Hash Lookups sind ja schon zahlreich.
Noch als Anmerkung: grep sucht nicht, sondern filtert. Wenn man nur
wissen will, ob es drin ist kann man Dinge wie List::Util's first[0]
(seit 5.8 im core) oder z.B. Perl6-Junction's any[1] verwenden.

gr.,
Robert

[0] http://search.cpan.org/dist/Scalar-List-Utils/lib/List/Util. pm
[1] http://search.cpan.org/dist/Perl6-Junction/Junction.pm#any()

--
That is not dead, which can eternal lie,
and with strange aeons even death may die.
-- H.P. Lovecraft