Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7551[/thread]

Bestimmte Zeilen UND folgende aus Array löschen

Leser: 2


<< >> 6 Einträge, 1 Seite
Gast Gast
 2005-12-19 10:31
#61098 #61098
Hi,

Ich habe folgendes Problem:

Ich habe hier ein Array, das sieht aus wie folgt:

Code: (dl )
1
2
3
4
5
6
7
8
9
$VAR1 = [
         '1 ABC blabla',
         '2 DEF blabla',
         '3 GHI blabla',
         '         blablabla',
         '4 JKL blabla',
         '5 MNO blabla',
         '6 PQR blabla',
       ];

       
Ich möchte nun alle Einträge löschen, die am Zeilenanfang keine Zahl enthalten UND alle folgenden Einträge.
Das Array sollte also am Ende so aussehen:

Code: (dl )
1
2
3
4
5
$VAR1 = [
         '1 ABC blabla',
         '2 DEF blabla',
         '3 GHI blabla',
       ];

 
Matchen kann man das ja wunderbar mit \w bzw. \s .
Aber wie kann ich das genau machen? Ich brauche eine Schleife, die Zeile für Zeile das Array überprüft. Das könnte man ja einfach mit scalar erledigen (Solange $counter < scalar(@array)).
Sobald eine Zeile mit Leerzeichen am Anfang gefunden wird, soll das ganze abgebrochen werden.

Kann mir jemand einen Denkanstoß geben?
Danke schon mal im Voraus.

Gruß
rag
ragnar
 2005-12-19 11:08
#61099 #61099
User since
2005-11-21
3 Artikel
BenutzerIn
[default_avatar]
Hi,

habe es selbst hinbekommen:

Code: (dl )
1
2
3
4
5
6
7
my $count = 0;
foreach (@$array)
{
last if(@$array[$count] =~ m/^\s+.*$/);
push (@$array2, @$array[$count]);
$count ++;
}


Wenn jemand eine elegantere Lösung hat, bin ich natürlich trotzdem noch gespannt :-)

Danke!
J-jayz-Z
 2005-12-19 11:11
#61100 #61100
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du nutzt ein zweites Array, das kannst du auch nur mit diesem enen Array machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my @array = ('1 ABC blabla', '2 DEF blabla', ' blablabla', '4 JKL blabla', '5 MNO blabla', '6 PQR blabla');
my $status = 1;
for(0..$#array) {
if($array[$_]) {
if($array[$_] !~ m/^\d.*/ && $status) {
splice @array, $_;
$status = 0;
} elsif(! $status) {
splice @array, $_;
}
}
}
print $_ . "\n" for @array;
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Dubu
 2005-12-19 11:45
#61101 #61101
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Warum so kompliziert? Und was soll das mit dem Status??
Code: (dl )
1
2
3
4
5
for (0 .. $#array) {
   next if $array[$_] =~ /^\d/;  # okay, weiter
   splice @array, $_;            # alles ab hier abschneiden
   last;                        # abbrechen
}
J-jayz-Z
 2005-12-19 11:49
#61102 #61102
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
*meep* 1:0 für Dubu :)
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
renee
 2005-12-19 11:54
#61103 #61103
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein Code etwas kuerzer:
Code: (dl )
1
2
3
4
foreach (@$array){
last if($_ =~ m/^\s/);
push (@$array2, $_);
}


Edit: Dubu hat aber einen besseren Weg gezeigt...\n\n

<!--EDIT|renee|1134986684-->
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/
<< >> 6 Einträge, 1 Seite



View all threads created 2005-12-19 10:31.