Ein Element aus einem Array entfernen
coolblue
- perl
0 coolblue0 Christian Kruse0 coolblue
0 EisFux
Hallo,
wie entfernt man optimaler Weise ein Element aus einem Array.
Ich weiß das es zum Leeren eines Skalars zwei Möglichkeiten gibt.
1. undef $skalar;
2. $skalar="";
Bisher habe ich die Option undef vorgezogen, weil vermutlich der Speicherplatz ans System freigegeben wird, denn mit $skalar=""; weise ich ja nur einen neuen Wert zu, bin mir dessen aber nicht sicher. Trifft dies auch für ein Array zu oder wird jegliche Entität des Elements gelöscht, damit meine ich das ganze Array?
Für Hilfe wäre ich dankbar.
Viele Grüße,
coolblue
Hallo,
wie entfernt man optimaler Weise ein Element aus einem Array.
Ich weiß das es zum Leeren eines Skalars zwei Möglichkeiten gibt.
- undef $skalar;
- $skalar="";
Bisher habe ich die Option undef vorgezogen, weil vermutlich der Speicherplatz ans System freigegeben wird, denn mit $skalar=""; weise ich ja nur einen neuen Wert zu, bin mir dessen aber nicht sicher. Trifft dies auch für ein Array zu oder wird jegliche Entität des Elements gelöscht, damit meine ich das ganze Array?
Für Hilfe wäre ich dankbar.
Viele Grüße,
coolblue
Nachtrag: ich möchte nicht mit shift arbeiten, da der Index eine feste Struktur besitzt und shift die Elemente an eine falsche Position rücken würde.
Viele Grüße,
coolblue
你好 coolblue,
wie entfernt man optimaler Weise ein Element aus einem Array.
Ich weiß das es zum Leeren eines Skalars zwei Möglichkeiten gibt.
- undef $skalar;
- $skalar="";
Bisher habe ich die Option undef vorgezogen, weil vermutlich der
Speicherplatz ans System freigegeben wird, denn mit $skalar=""; weise
ich ja nur einen neuen Wert zu, bin mir dessen aber nicht sicher.
Nein, Perl5 gibt den Speicher erst frei, wenn der Interpreter beendet wird.
Wenn du ein Element eines Arrays loeschen willst, schau dir die Funktion
“splice” an.
再见,
CK
Hallo Christian,
Wenn du ein Element eines Arrays loeschen willst, schau dir die Funktion
“splice” an.
Habe ich, aber ich brauche wohl ein Anwendungsbeispiel.
Simples Beispiel:
$array[0]="Hallo";
$array[1]="Herr";
$array[2]="Christian Kruse";
$array[3]="Kruse";
$array[4]="Wie geht es Ihnen?";
Ich möchte die Elemente mit Index 1-3 Löschen und den Speicher ans System wieder frei geben. Wie mache ich das genau?
Viele Grüße,
coolblue
perldoc -fsplice
Bert
Hallo coolblue,
wie entfernt man optimaler Weise ein Element aus einem Array.
Bisher habe ich die Option undef vorgezogen, weil vermutlich der Speicherplatz ans System freigegeben wird, denn mit $skalar=""; weise ich ja nur einen neuen Wert zu, bin mir dessen aber nicht sicher. Trifft dies auch für ein Array zu oder wird jegliche Entität des Elements gelöscht, damit meine ich das ganze Array?
Was hast du nur immer mit dem Speicherplatz? Darum kümmert sich die Perl-Laufzeitmgebung schon selbst. Mit undef() wird zwar die Variable für den Perl-Code gelöscht (will sagen: der Zeiger darauf wird zurückgesetzt), aber ob der Speicher freigegeben wird (für andere Prozesse), darauf hast du hier keinen Einfluss. (Leider :( )
Für Hilfe wäre ich dankbar.
SelfHTML ist mehr als ein Forum ;-)
splice()
http://de.selfhtml.org/cgiperl/funktionen/listenhashes.htm#splice
und falls du es doch nochmal mit undef() probieren willst:
http://de.selfhtml.org/cgiperl/funktionen/listenhashes.htm#undef
Viele Grüße,
EisFuX
Hallo EisFux,
Was hast du nur immer mit dem Speicherplatz? Darum kümmert sich die Perl-Laufzeitmgebung schon selbst.
Perl der Allmächtige kümmert sich um alles *g*
Warum programmiere ich dann noch überhaupt? Warum sollte ich Deklarieren, warum sollte ich denn nicht in einer while Schleife endlos Subshells öffnen..., wenn Perl alles für mich händelt??? Ich mache mir Gedanken um meine Ressourcen und über die anderen 1200 Benutzer, die auf der gleichen Maschine arbeiten!!! Alleine der Perl-Laufzeitumgebung alles zu überlassen, ist, so denke ich, der falsche Ansatz.
Soll ich denn ein 50 MB großes Element einfach im Speicher liegen lassen, obwohl es zunächst nicht mehr gebraucht wird, der Prozess aber weiterin läuft... nonstop?
Und noch immer weiß ich nicht wie es funktioniert. Ich suche dann mal fleißig weiter :-)
Danke.
Viele Grüße,
coolblue
你好 coolblue,
Warum programmiere ich dann noch überhaupt?
Ja, den Sarkasmus kannst du auch getrost weglassen. Niemand hat gesagt, du
sollst verschwenderisch mit den Ressourcen umgehen. Es wurde nur gesagt,
dass man auf die Speichernutzung geringen bis keinen Einfluss
hat -- wenn du es anders moechtest, benutze Sprachen wie C oder Pascal.
Soll ich denn ein 50 MB großes Element einfach im Speicher liegen
lassen, obwohl es zunächst nicht mehr gebraucht wird, der Prozess
aber weiterin läuft... nonstop?
Beschaeftige dich mal mit Technologien wie Speicherverwaltung mit Hilfe
von Reference Counting. Perl merkt schon, wenn du den Array nicht mehr
verwendest -- es sei denn, du machst ganz wilde, zirkulaere Konstrukte
(wobei nicht klar ist, ob in dem Fall Perl die Referenzen “von Hand”
aufbricht, dazu muesste man sich den Sourcecode angucken).
再见,
CK
Hallo Christian,
Ja, den Sarkasmus kannst du auch getrost weglassen.
es war weder Sarkasmus noch unfreundlich. Eher freundliche Ironie! Ich habe eine Frage gestellt und erwarte eigentlich eine Anwort darauf, stattdessen erhalte selber sarkastische bzw. sinnlose Antworten!
Perl merkt schon, wenn du den Array nicht mehr verwendest --
Du scheinst auch zu der Sorte zu gehören, die nur Unsinn von sich geben können! Ich versuche ein Projekt in Perl zu entwickeln und nicht in C oder einer anderen Sprache. Welche Aspekte mich dazu führen, muss ich hier doch nicht erläutern! Jeder backt halt sein eigenes Brot und da niemand sonst hier ausser ich den Code kennt, den ich schreibe, wäre es doch viel einfacher, mir insoweit behilflich zu sein, indem man einfach meine Frage beantwortet, anstatt wilde Spekulationen zu beginnen.
Lies doch demnächst einfach über meine Threads hinweg, wenn sie dich stören. Danke.
Viele Grüße,
coolblue
你好 coolblue,
*rotfl* jetzt weiss ich ja, wie ich dich einordnen muss.
再见,
CK
Hallo Christian.
Nun ja, ordne mich ein wie du magst, das machen wir sowieso alle. Aber dabei frech zu werden, ist nicht nett. Tu ich doch auch nicht. Hab immer ein :-) auf den Lippen. Ich bin hier, um Wissen und Erfahrungen auszutauschen, nicht um Andere abzuwerten oder die Art von Ratschlägen zu erteilen, mit denen ich ihnen Dummheit vorschmeisse.
Also Christian, gibt es jetzt eine Möglichkeit, ein Element eines Array genau zu dem Zeitpunkt zu leeren, wenn ich es möchte und nicht "Perl"? Und so das der Speicher ebenfalls für das System freigegeben wird.
Um Hilfe wäre ich weiterhin dankbar.
Viele Grüße,
coolblue
你好 coolblue,
Nun ja, ordne mich ein wie du magst, das machen wir sowieso alle.
Aber dabei frech zu werden, ist nicht nett.
Schatzi, fass dich mal an die eigene Nase. Frech geworden bist du hier,
ich habe dir lediglich begreiflich gemacht, dass du keine Gewalt ueber
das Speichermanagement von Perl hast und dir Hinweise auf weiterfuehrende
Literatur gegeben. Wenn dir das nicht passt, ueberlies es doch einfach.
Also Christian, gibt es jetzt eine Möglichkeit, ein Element eines
Array genau zu dem Zeitpunkt zu leeren, wenn ich es möchte und nicht
"Perl"? Und so das der Speicher ebenfalls für das System freigegeben wird.
Lies mein Posting.
Egal, EOT und EOD fuer mich, von nun an werde ich dich ignorieren.
再见,
CK
Hallo,
Schatzi, fass dich mal an die eigene Nase. Frech geworden bist du hier,
hmmm, wie man in den Wald ruft, so schallt es auch heraus! Ist zwar nicht richtig was du schreibst, aber ok, du wirst mich ignorieren. Passt mir sehr gut. Danke.
Falls du doch mal einen wirklich hilfreichen Kommentar loswerden willst, ist er gerne willkommen. Bezüglich des Reference Counting werde ich mich schlau machen.
Viele Grüße,
coolblue
Ja, den Sarkasmus kannst du auch getrost weglassen.
es war weder Sarkasmus noch unfreundlich. Eher freundliche Ironie! Ich habe eine Frage gestellt und erwarte eigentlich eine Anwort darauf, stattdessen erhalte selber sarkastische bzw. sinnlose Antworten!
Nein, die Antwort ist genau das was auf deine Frage einen Sinn ergibt.
Perl merkt schon, wenn du den Array nicht mehr verwendest --
Du scheinst auch zu der Sorte zu gehören, die nur Unsinn von sich geben können! Ich versuche ein Projekt in Perl zu entwickeln und nicht in C oder einer anderen Sprache. Welche Aspekte mich dazu führen, muss ich hier doch nicht erläutern! Jeder backt halt sein eigenes Brot und da niemand sonst hier ausser ich den Code kennt, den ich schreibe, wäre es doch viel einfacher, mir insoweit behilflich zu sein, indem man einfach meine Frage beantwortet, anstatt wilde Spekulationen zu beginnen.
Wenn du in deinem Code 50 MB einliest wirst du sicher einen Grund dafür haben, wenn du diese nicht global benutzt ist der Rest kein Problem für dich. Darum kümmert sich Perl.
das hat nichts mit Allmächtig oder sonstwas zu tun, sondern in Perl brauchst du dich um solche Dinge wie Speicherveraltung nicht zu kümmern. Das kann unter gewissen Umständen sicher von Nachteil sein, in 99.99% der Fälle ist es nützlich und nimmt dir enorm Arbeit ab. wenn du der Meinung bist deine Anwendung gehört zu den wenigen Fällen in denen du Kontrolle über den Speicher haben musst, ist Perl definitiv die falsche Programmiersprache. Da es diese Möglichkeit nicht gibt.
Das hat nichts mit wilder Spekulation zu tun, sondern es hängt mit deiner Fragestellung zusammen. Du fragst, bekommst eine Antwort und willst dich aber nicht damit zufrieden geben, sondern bist immer noch der Meinung das deine Frage nicht beantwortet wurde, obwohl bereits geschehen und zwar hier https://forum.selfhtml.org/?t=95854&m=582459
um das zu präzisieren, es spielt keine Rolle ob du undef $var oder $var = undef schreibst, der Speicher wird nicht frei gegeben. Im ersten Falle existiert die Referenz auf $var nicht mehr im zweiten die Referenz auf den Inhalt. aber ob und wann der Speicher freigegeben wird hängt von anderen Faktoren ab, die in Perl nicht beeinflußbar sind.
Struppi.
Halli hallo Struppi,
hoffentlich fängst du jetzt nicht auch noch so an!
sondern bist immer noch der Meinung das deine Frage nicht beantwortet wurde, obwohl bereits geschehen und zwar hier https://forum.selfhtml.org/?t=95854&m=582459
Die Antwort habe ich akzeptiert, dass hatte ich doch geschrieben! Nur war sie für mich nicht ausreichend... ein gutes Recht meinerseits, oder etwa nicht?
um das zu präzisieren, es spielt keine Rolle ob du undef $var oder $var = undef schreibst, der Speicher wird nicht frei gegeben.
Soetwas ist eine präzise Antwort, was nicht heißen soll, dass ich nicht gerne spekuliere.
Ja, den Sarkasmus kannst du auch getrost weglassen.
Aber ich finde es einfach ätzend, dass in den meisten Threads hier zunächst mit dem bösen Finger auf jemanden gezeigt wird. Find ich nicht ok und von dieser Meinung werde ich auch nicht zurücktreten, auch wenn du nun Partei ergreifst. Mag zwar solidarisch sein, ist aber trotzdem falsch. Das ich im nachhinein selber unfreundlich werde, dafür entschuldige ich mich!
Thema beendet? Danke.
Viele Grüße,
coolblue
hoffentlich fängst du jetzt nicht auch noch so an!
nö, hatte ich nicht vor.
sondern bist immer noch der Meinung das deine Frage nicht beantwortet wurde, obwohl bereits geschehen und zwar hier https://forum.selfhtml.org/?t=95854&m=582459
Die Antwort habe ich akzeptiert, dass hatte ich doch geschrieben! Nur war sie für mich nicht ausreichend... ein gutes Recht meinerseits, oder etwa nicht?
Klar, aber nach wie vor ist es hier gerne gesehen ein bisschen Eigeninitiative zu leisten und mit ein bisschen Suchen wäre vielleicht sogar ...
um das zu präzisieren, es spielt keine Rolle ob du undef $var oder $var = undef schreibst, der Speicher wird nicht frei gegeben.
Soetwas ist eine präzise Antwort, was nicht heißen soll, dass ich nicht gerne spekuliere.
.. was besseres und genaueres rausgekommen, da meine Kenntnisse über Perl interna nicht wirklich gut sind.
Ja, den Sarkasmus kannst du auch getrost weglassen.
Aber ich finde es einfach ätzend, dass in den meisten Threads hier zunächst mit dem bösen Finger auf jemanden gezeigt wird. Find ich nicht ok und von dieser Meinung werde ich auch nicht zurücktreten, auch wenn du nun Partei ergreifst. Mag zwar solidarisch sein, ist aber trotzdem falsch. Das ich im nachhinein selber unfreundlich werde, dafür entschuldige ich mich!
eine Diskussion die hier immer wieder gerne geführt wird und es gibt auch sehr unterschiedliche Aufassungen darüber wie es vermittelt wird. Aber eine der positiven Ansätze (neben viel Wissen ;-) ) ist der, das das selfforum kein Supportforum sein soll. Also wenn du was wissen willst wirst du hier oft nur mit Hinweisen gefüttert, die dir helfen mehr über deine Frage und die Antworten rauszufinden. Was letzlich auch für dich von Vorteil ist, denn keiner wird dir umfassend hier Antworten können oder wollen, zumal bei Themen die umfangreicheres Wissen erfordern. Dafür existieren im Netz vielfältige Quellen.
Thema beendet? Danke.
Ich hab alles gesagt, was ich sagen konnte. wenn ich du mehr Wissen willst, müßte ich googlen, aber ich zweifle nicht daran das du dazu nicht selber in der Lage wärst.
Struppi.
Hiho Struppi,
Ich hab alles gesagt, was ich sagen konnte. wenn ich du mehr Wissen willst, müßte ich googlen, aber ich zweifle nicht daran das du dazu nicht selber in der Lage wärst.
hmmm... googlen tu' ich schon viel zu viel :-)
Ich habe ja immer die hoffnung, dass jemand meine Frage gezielt beanworten kann. Ok bis dann. Ich google dann mal.
Viele Grüße,
coolblue
Hiho coolblue,
<insert>
Vorsorglicher Grinsesmiley: ;-)
</insert>
Ich habe ja immer die hoffnung, dass jemand meine Frage gezielt beanworten kann. Ok bis dann. Ich google dann mal.
Gezielte Beantwortung setzt gezieltes Fragen voraus:
Dein gewähltes Thread-Thema lautete:
(PERL) Ein Element aus einem Array entfernen
In Wirklichkeit wolltest du aber wissen, wie Großmeister Perl (;-)) intern den Speicher für seine Variablen verwaltet, richtig?
Das Problem hierbei, liegt erstens in der unglücklichen Wahl der Überschrift (deinerseits -- aber bitte nicht hauen ...). Und zweitens ist dieses Forum hier vor allem für Web-(-Design, -Mastering, -Programming, -...)-Probleme geschaffen worden, auch wenn hier schon mal Fragen zu Optionsscheinen und Einstiegsgehältern von Junginformatikern vorkommen. Deine Fragen beziehen sich ja eher auf Laufzeitverhalten und Code-Optimierung (für Compiler), und ich glaube, da wärst du mit C(++) oder Assembler besser bedient.
hmmm... googlen tu' ich schon viel zu viel :-)
Hast du schon mal in die PODs zu den Perl-Modulen B und O geschaut? Zumindest werden dort einige Interna des Perl-Systems angesprochen.
Viele Grüße,
EisFuX
P.S. Füchse lächeln nicht ;-). Ich glaube, dass ist bei denen anatomisch nicht möglich.
Grinseprinz EisFux,
<insert>
Vorsorglicher Grinsesmiley: ;-)
</insert>
nun ja, wir haben uns schon kennengelernt :-)
bin ich denn wirklich so schlimm?
In Wirklichkeit wolltest du aber wissen, wie Großmeister Perl (;-)) intern den Speicher für seine Variablen verwaltet, richtig?
Falsch :-)
(PERL) Ein Element aus einem Array entfernen
und den Speicher, den das Element belegt hat, wieder an das System zurückgeben. Denkbares Beispiel:
undef $array[5] -> <storagebacktosystem>;
undef @array -> <storagebacktosystem>;
Aber soetwas gibt es wohl leider nicht.
Die Frage war, ob es einen Befehl in Perl gibt, der nicht nur einen Skalar leert, sondern auch den durch den Skalar belegten Speicher wieder ans System zurückgibt. Ein weiteres Beispiel, um einen kleinen Einblick in meine Situation zu geben:
Ich generiere eine Vielzahl von Grafiken mit dem Modul GD::Graph::lines. Diese Bilder werden über den Browser dargestellt...
diese Info zu deiner Bemerkung:
Und zweitens ist dieses Forum hier vor allem für Web-(-Design, -Mastering, -Programming, -...)-Probleme geschaffen worden
Die Arrays leere ich zwar am Ende meines Scripts, aber trotzallem bleibt die Speicherbelegung dauerhaft bei ca. 26 MB. Da leider mehrere Prozesse gestartet sind (FCGI), um genau zu sein 10, belegen diese dauerhaft ca. 260 MB.
Viele Grüße,
coolblue
Also Christian,
EisFux lächelt,
Was hast du nur immer mit dem Speicherplatz? Darum kümmert sich die Perl-Laufzeitmgebung schon selbst...
Für Hilfe wäre ich dankbar.
SelfHTML ist mehr als ein Forum ;-)
ich lächel ebenfalls,
Perl der Allmächtige kümmert sich um alles *g*
Warum programmiere ich dann noch überhaupt?
Ich suche dann mal fleißig weiter :-)
du hingegen bist unfreundlich...
Ja, den Sarkasmus kannst du auch getrost weglassen.
und wenn der Begin einer Nachricht schon unfreundlich war, kann ich vom Rest auch nicht viel halten...
ode doch Herr Meister Jedi :-)
Beschaeftige dich mal mit Technologien wie Speicherverwaltung mit Hilfe
von Reference Counting.
Trotzallem werde ich diesen Rat beherzigen.
Nun gut, Mr. Celvin Klein. Gute Nacht wünsch ich. Bis dann :-)
Viele Grüße,
coolblue