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

Array + Dateien



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2005-07-19 01:24
#5277 #5277
HI jungs,
also ich habe folgendes in einer Datei stehen
"Test1","bla"
"Test2","blub"
usw... immer nach den gleichen Muster das lese ich aus :
foreach my $aktIn (@fileIn) {


if($aktIn =~ /"(.*)","(.*)"/) {
#... }

}
klappt soweit auch nun habe ich das halt genauso im Array
nun möchte ich aber einen eintrag meinetwegen Test1 löschen also die ganze Zeile welche "Test1","..." enthält
und dann den Array neu in eine Datei schreiben nur hier hänge ich :(

Gruß Patrick
Ishka
 2005-07-19 01:37
#5278 #5278
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wenn du den Indexeintrag des zu entfernenden Elementes kennst, kannst du das mit splice ,,@fileIn,$indexeintrag,1;'' dieses entfernen.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
cooldie
 2005-07-19 02:00
#5279 #5279
User since
2005-07-19
14 Artikel
BenutzerIn
[default_avatar]
Danke für deinen Eintrag ja ich habs so schon versucht

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
open(INPUTFILE,"defs.cfg");
 
my @fileIn=<INPUTFILE>;
 
close(INPUTFILE);

my $actPos = 0;

my $delPos = 0;
 
foreach my $aktIn (@fileIn) {


$actPos++;

if($aktIn =~ /"(.*)","(.*)"/) {




if($1 eq $suchen) {


$matching = "true";


$delPos = $actPos;




splice(@fileIn, $delPos, $delPos, 1);



} else {


if($matching ne "true") {


$matching = "false";


}


}

}





}

Wie man sieht hab ichs so versucht nur leider klappt das nicht :(
Es klappt ab und zu aber manchmal löscht er es falsch oder gar nicht jemand eine Idee?
Gruß Patrick\n\n

<!--EDIT|cooldie|1121724171-->
Ishka
 2005-07-19 02:04
#5280 #5280
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Dafür kannst du auch folgendes machen
Code: (dl )
@fileIn = grep {!m/^"\Q$suchen\E"/} @fileIn;
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
renee
 2005-07-19 02:54
#5281 #5281
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde auch Tie::File benutzen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#! /usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file = '/path/to/file.txt';
tie my @array,'Tie::File',$file or die $!;
@array = grep{!m/^"\Q$suchen\E"/}@array;
untie @array;
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/
cooldie
 2005-07-19 02:55
#5282 #5282
User since
2005-07-19
14 Artikel
BenutzerIn
[default_avatar]
Hi,
Kann damit leider nichts anfangen :-(

Habt ihr evtl. einen vollständigen Code ich peils nun gar nicht mehr :-(

Gruß Patrick

EDIT : Kann damit nichts anfangen da ich leider noch nicht so gut Perl kann.\n\n

<!--EDIT|cooldie|1121727478-->
Ishka
 2005-07-19 03:10
#5283 #5283
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Mein Codestück macht folgendes: Entfernt alle Einträge aus @fileIn, die mit "$suchen" anfangen, wobei der Wert von $suchen eingesetzt wird.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
cooldie
 2005-07-19 03:33
#5284 #5284
User since
2005-07-19
14 Artikel
BenutzerIn
[default_avatar]
Danke habs nun dank eurer Hilfe hunbekommen.

Gruß Patrick
renee
 2005-07-19 10:51
#5285 #5285
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ups, ich habe vergessen $suchen zu setzen...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#! /usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $suchen = 'Test1';
my $file = '/path/to/file.txt';
tie my @array,'Tie::File',$file or die $!;
@array = grep{!m/^"\Q$suchen\E"/}@array;
untie @array;


Was macht mein Code?

Als erstes verwende ich use strict;.
Um mir das Leben möglichst einfach zu machen, verwende ich das Modul CPAN:Tie::File. Damit kann ich den Inhalt einer Datei an ein Array "binden". Das heißt, dass in jedem Element des Arrays eine Zeile der Datei steht.
Das "binden" erfolgt bei tie my @array.... Das grep ist das gleiche wie bei Ishka!
Mit untie schreibe ich den Inhalt des Arrays wieder in die Datei zurück...
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/
pq
 2005-07-19 12:39
#5286 #5286
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@cooldie: in deinem code mit splice veränderst du das array, während
du darüber iterierst. das solltest du nicht tun, denn das verwirrt perl,
wenn du ihm ein element unter der nase wgziehst und ihm ein anderes
unterschiebst.
in so einem fall einfach mit reverse iterieren.
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
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-07-19 01:24.