Ermitteln ob ein Array-Element existiert, wenn nicht anhängen...
Sergej
- perl
Hallo,
Ermitteln ob ein Hash-Namen existiert gibt es ja (exist),
aber wie kriege ich raus ob ein bestimmtes Element(Zeichenkette) in einem Array vorhanden ist?
mit 'grep' sieht es komisch.
if (grep($element, @array) != 0)
{
@vorhanden = unshift(@vorhanden,$element);
@vorhanden = push(@vorhanden,$element);
}
Bitte um Vorschläge.
Danke.
Gruß Sergej
Halihallo Sergej
Ermitteln ob ein Hash-Namen existiert gibt es ja (exist),
aber wie kriege ich raus ob ein bestimmtes Element(Zeichenkette) in einem Array vorhanden ist?
mit 'grep' sieht es komisch.
if (grep($element, @array) != 0)
perldoc -f grep
Evaluates the BLOCK or EXPR for each element of LIST (locally
setting "$_" to each element) and returns the list value
consisting of those elements for which the expression evaluated
to true. In scalar context, returns the number of times the
expression was true.
Naja, in deinem Fall vielleicht nicht ganz sinnvoll, jedoch funktional.
{
@vorhanden = unshift(@vorhanden,$element);oder
@vorhanden = push(@vorhanden,$element);
}
perldoc -f push
perldoc -f unshift
ACHTUNG: Diese Funktionen geben die die neue _Anzahl_ Elemente des Arrays zurück!
if (grep($element,@array) > 0) {
push( @vorhanden, $element );
}
Hast du eigentlich das andere Problem von weiter unten lösen können? - Das @Msg-Ding da.
Viele Grüsse
Philipp
Halihallo Sergej
?? - Der Titel sagt aber was ganz anderes!
my $anfuegen = 1;
foreach (@array) {
if ($_ eq $element) {
$anfuegen = undef;
}
}
if ($anfuegen) {
push @array, $element;
}
Viele Grüsse
Philipp
Hallo Phil and @ll,
Die Schleife bleibt bei der Ausgabe hängen, scheint als wäre sie in einer Endlosschleife. Wieso?
for (my $i=0; $i <=$z_nr; $i++ ) {
for (my $j=$i+1; $j <=$z_nr; $j++ ){
if (($Msg[$i] eq $Msg[$j]) and (abs(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd))) {
foreach (@vorhanden) {
if ($_ eq $Msg[$j]) {
$anfuegen = undef;
}
}
if ($anfuegen) {
push (@vorhanden, $Msg[$j]);
print FHout $zeile[$i];
print FHout $zeile[$j]."\n";
print "\n $i -- $j \n";
}
}
}
}
Gruß Sergej
Halihallo Sergej
Die Schleife bleibt bei der Ausgabe hängen, scheint als wäre sie in einer Endlosschleife. Wieso?
Ich sehe keinen Grund dazu. Wieviele Elemente lässt du denn verarbeiten? - Das Programm
ist nicht wirklich performant, könnte gut sein, dass es einfach sehr lange dauert.
Versuche einige prints einzusetzen, ala print "jetzt: $i/$j\n"
Versuche auch, eine angenehme Struktur zu erarbeiten. Also bei jedem { eine Zeile dazu
und um vier Zeichen einrücken, bei jedem } auch eine neue Zeile, aber wieder vier zurück.
So kannst du sehen, ob du irgendwo eine Klammer falsch gesetzt hast.
TimeAbstd sei eine Konstante? - Hat zwar nix mit Endlosschleife zu tun, aber Konstanten
werden GROSS geschrieben und wie definierst du sie?
Viele Grüsse
Philipp
Hallo Phil,
TimeAbstd sei eine Konstante? - Hat zwar nix mit Endlosschleife zu >>tun, aber Konstanten
werden GROSS geschrieben und wie definierst du sie?
use constant TimeAbstd => 5;
__________________________________________________________
Bildschirmausgabe:
13843
13844
13845
13846
13847 <<==die letzte eingelesene Zeile in einem Array @zeile
2 -- 1231 <<== Ausgabe $i -- $j
17 -- 1434 <<== Ausgabe $i -- $j
!!! Ab hier bleibt er stehen
__________________________________________________________
An der Größe kanns nicht liegen.
Im Ausgabefile sind 0 Byte, hatte schon mal 150 MB ;-)
ich denke hier ist was Falsch:
if ($anfuegen) {
push (@vorhanden, $Msg[$j]);
print FHout $zeile[$i];
print FHout $zeile[$j]."\n";
print "\n $i -- $j \n";
}
Danke.
Gruß Sergej
Hallo Phil,
du hattest recht!!
$anfuegen = 1; genau das hat gefehlt.
Das muß man ja jedes mal auf 1 setzen sonst undef...
Tolle Zusammenarbeit!
Danke Gruß Sergej
Halihallo Sergej
Uh, wollte schon auf das andere antworten...
du hattest recht!!
$anfuegen = 1; genau das hat gefehlt.
Das muß man ja jedes mal auf 1 setzen sonst undef...
Das wars?? - Na gut... ;)
Tolle Zusammenarbeit!
Freut mich helfen zu können.
Viele Grüsse
Philipp
PS: Konstanten werden GROSS geschrieben, genau wie Filehandles! :-)
Halihallo Sergej
for (my $i=0; $i <=$z_nr; $i++ ) {
for (my $j=$i+1; $j <=$z_nr; $j++ ){
if (
($Msg[$i] eq $Msg[$j]) and
(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd)
) {
$anfuegen = 1;
foreach (@vorhanden) {
if ($_ eq $Msg[$j]) {
$anfuegen = undef;
}
}
if ($anfuegen) {
push (@vorhanden, $Msg[$j]);
print FHout $zeile[$i];
print FHout $zeile[$j]."\n";
print "\n $i -- $j \n";
}
}
}
}
hier eine etwas lesbarere Struktur... $anfuegen muss schon auf 1 gesetzt werden!
Viele Grüsse
Philipp
Hallo Phil,
Cool du bist auch hier, ich dachte alle sind auf Fashing.
Das ist ein Teilproblem von gestern ;-)
Mit dem couter kam ich nicht zurecht :-(
Hier meine Superschleife mit Messages:
Hier wird jede Message nur einmal mit jeder verglichen(wg. j=i+1)
MsgTime ist nur eine sonderbedingung!
TimeAbstd ist eine constante.
for (my $i=0; $i <=$z_nr; $i++ ) {
for (my $j=$i+1; $j <=$z_nr; $j++ ){
if (($Msg[$i] eq $Msg[$j]) and (abs(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd))) {
next if ($Msg[$i] element @vorhanden); # <= ????????? so was ähnliches
@vorhanden = unshift(@vorhanden,$Msg[$j]);
print FHout $zeile[$i];
print FHout $zeile[$j]."\n";
print "\n $i -- $j \n";
}
}
}
Und du meinst ich solls mit
if (grep($element,@array) > 0) {
push( @vorhanden, $element );
}
probieren?
Gruß Sergej
Halihallo Sergej
Cool du bist auch hier, ich dachte alle sind auf Fashing.
Da ich nicht 'alle' bin, darf ich arbeiten :-)
for (my $i=0; $i <=$z_nr; $i++ ) {
for (my $j=$i+1; $j <=$z_nr; $j++ ){
if (($Msg[$i] eq $Msg[$j]) and (abs(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd))) {
next if ($Msg[$i] element @vorhanden); # <= ????????? so was ähnliches
Das 'abs' brauchst du nicht.
if (grep( $_ eq $Msg[$j], @array ) > 0) { next; }
wäre richtig.
Und du meinst ich solls mit
if (grep($element,@array) > 0) {
push( @vorhanden, $element );
}
s. oben. grep prüft die EXPR auf "Wahr". Wenn $element definiert ist und nicht gleich
0 oder "", ist die Bedingung _immer_ wahr. Du musst schon mit $_ vergleichen, $_ ist
das aktuelle Element von @array.
Einfach sagen, was nicht funktioniert; hab mir alles nicht sehr genau angesehen.
Viele Grüsse
Philipp