Schrift
[thread]6247[/thread]

arrayelement einfügen: ein element in ein array einfügen



<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
mordur
 2004-05-11 11:49
#82217 #82217
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich habe ein Array:


@array("hallo","du","bist ja\n immer noch","da");



man sieht da gibts ein Element mit Zeilenumbruch. Das soll geteilt und als zwei neue Elemente an genau dieser Stelle wieder eingesetzt werden.Das Array soll dan so aussehen.


@array("hallo","du","bist ja","immer noch","da");



Es können auch mehrere Zeilenumbrüche drin sein. Dann müssen entsprechend mehr Elemente eingefügt werden.

gruß mordur
renee
 2004-05-11 13:46
#82218 #82218
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
so könnte man es machen:
Code: (dl )
1
2
3
4
my @neues_array = ();
foreach(@array){
push(@neues_array,split(/\n/,$_));
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2004-05-11 15:29
#82219 #82219
oder auch so:
Code: (dl )
1
2
3
4
5
6
7
    foreach $part (@altes_array) {
       $part =~ /\n/
           ?   do {
                   (push @neues_array, $_) foreach (split /\n/, $part)
               }
           :   (push @neues_array, $part);
   }
Crian
 2004-05-11 16:03
#82220 #82220
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Oder das Element per splice ein- und ausfädeln.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Gast Gast
 2004-05-11 16:24
#82221 #82221
[quote=Crian,11.05.2004, 14:03]Oder das Element per splice ein- und ausfädeln.[/quote]
Dazu muß dann aber zunächst einmal die jeweilige Position ermittelt werden :)
Crian
 2004-05-11 16:38
#82222 #82222
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ja, aber Du sparst das Umkopieren, das kann ein gewaltiger Vorteil sein.

Ich dachte mir das etwa so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

my @array = ("hallo", "du", "bist ja\n immer noch", "da");

print "'$_'\n" for @array;

my $i = $#array;
while ($i>=0) {
my $count = $array[$i] =~ y/\n//;
splice @array, $i, 1, split /\n/, $array[$i] if $count;
--$i;
}

print "'$_'\n" for @array;


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
'hallo'
'du'
'bist ja
immer noch'
'da'
'hallo'
'du'
'bist ja'
' immer noch'
'da'
\n\n

<!--EDIT|Crian|1084279740-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Gast Gast
 2004-05-11 18:47
#82223 #82223
[quote=Crian,11.05.2004, 14:38]Ja, aber Du sparst das Umkopieren, das kann ein gewaltiger Vorteil sein.[/quote]
Hast mich überzeugt Crian.
Was hälst Du davon es dann so zu machen:
Code: (dl )
1
2
3
4
        foreach (0 .. $#array) {
          my @count = split /\n/, $array[$_];
          $#count >= 0 && splice @array, $_, 1, @count;
       }
\n\n

<!--EDIT|Dieter|1084371645-->
pq
 2004-05-11 19:22
#82224 #82224
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Dieter,11.05.2004, 13:29]oder auch so:
Code: (dl )
1
2
3
4
5
6
7
    foreach $part (@altes_array) {
       $part =~ /\n/
           ?   do {
                   (push @neues_array, $_) foreach (split /\n/, $part)
               }
           :   (push @neues_array, $part);
   }
[/quote]
wieso das denn? das testet zusätzlich auf das vorhandensein von \n, aber split
muss ja eh nach \n suchen, also ist diese lösung 1. länger und unlesbarer und
2. vermutlich langsamer.
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
pq
 2004-05-11 19:23
#82225 #82225
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Crian,11.05.2004, 14:03]Oder das Element per splice ein- und ausfädeln.[/quote]
obacht, splice ist auch teuer. falls es mehrere elemente mit \n gibt, muss
jedesmal ein splice gemacht werden.
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
Gast Gast
 2004-05-11 19:49
#82226 #82226
[quote=pq,11.05.2004, 17:22][quote=Dieter,11.05.2004, 13:29]oder auch so:
Code: (dl )
1
2
3
4
5
6
7
    foreach $part (@altes_array) {
       $part =~ /\n/
           ?   do {
                   (push @neues_array, $_) foreach (split /\n/, $part)
               }
           :   (push @neues_array, $part);
   }
[/quote]
wieso das denn? das testet zusätzlich auf das vorhandensein von \n, aber split
muss ja eh nach \n suchen, also ist diese lösung 1. länger und unlesbarer und
2. vermutlich langsamer.[/quote]
Hast ja recht ... da war ich irgendwo auf dem falschen Dampfer ;)
split liefert natürlich auch dann den zu pushenden Wert zurück wenn kein \n enthalten ist (sorry renee)
und split ist natürlich schneller als ein Pattern-Matching - keine Frage.
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2004-05-11 11:49.