Schrift
[thread]8476[/thread]

String in Zeile einer Datei suchen



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Kalmuecke
 2006-11-06 12:08
#71448 #71448
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Hi,

ich lese eine Datei ganz normal ein.
Jetzt vergleiche ich jede einzelne Zeile mit bestimmten regulären Ausdrücken und speichere mir die Zeilen, die auf den regulären Ausdruck passen, in einem Array. Soweit kein Problem.

Aber wie bekomme ich es hin, daß wenn es mehrere Zeilen gibt, in denen mein regulärer Ausdruck drin vorkommt, daß ich mir nur einmal die Zeile in meinem Array merke, in der es als erstes vorkommt?

Gibt es da evt. einen besondere Funktion beim Lesen aus der Datei oder einen regulären Ausdruck???
Taulmarill
 2006-11-06 12:30
#71449 #71449
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
am besten währe es, wenn du mal ein wenig (also nur den wesendlichen teil) von deinem code posten könntest. grundsätzlich könntest du einen scalar benutzen, um die zeile zu speichern, und nur dann die zeile reinschreiben, wenn der scalar noch leer ist. wenn dich der rest der datei nicht interessiert, kannst du auch mit last die schleife beenden.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Kalmuecke
 2006-11-06 12:36
#71450 #71450
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $lineCounter      = 0;
my $line = "";
open(FILE, '<', $filename) || die "Error: Could not open!!!";
while( $line = <FILE> )
{
if ( ($line =~ /# Ausdruck1/) ||
($line =~ /# Ausdruck 2/) ||
($line =~ /# Ausdruck 3/) )
{
$contentLNKArray[$lineCounter++] = $line;
}
}


Das ist alles was ich habe!
Nun speichert mir aber das Programm alle Zeilen in denen die Ausdrücke vorkommen! Ich möchte aber nur die erste Zeile in der Datei, in der der Ausdruck vorkommt speichern!

Jemand eine Idee wie man das machen kann??
renee
 2006-11-06 13:02
#71451 #71451
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
my %hash;
my @regexs = (Ausdruck1, Ausdruck2, Ausdruck3);
open my $fh,'<',$filename or die $!;
while(my $line = <$fh>){
my ($regex) = grep{$line =~ /$_/}@regexs;
$hash{$regex} = $line unless exists $hash{$regex};
}
close $fh;


ungetestet...
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/
Kalmuecke
 2006-11-06 14:24
#71452 #71452
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
So ganz funktioniert es noch nicht!
Jedenfalls werden bei mir immer noch die Zeilen doppelt ausgegeben!

Aber kannst du mir auch erklären was genau in dem "Hacker"- Code :D gemacht wird?

EDIT: Pardon, doch er gibt es nur einmal aus! Aber leider steht in der Variable %hash auch noch meine @RegExs mit drin! Wie kann ich das denn vermeiden???\n\n

<!--EDIT|Kalmuecke|1162815978-->
Crian
 2006-11-06 14:24
#71453 #71453
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Einfach mit last rausgehen wenn ein Treffer auftrat.

Also mit deinem Code von oben:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $lineCounter      = 0;
my $line = "";
open(FILE, '<', $filename) || die "Error: Could not open: $!";
while( $line = <FILE> ) {
if ( $line =~ /# Ausdruck1/
or
$line =~ /# Ausdruck 2/
or
$line =~ /# Ausdruck 3/
) {
$contentLNKArray[$lineCounter++] = $line;
last;
}
}
\n\n

<!--EDIT|Crian|1162816086-->
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
renee
 2006-11-06 14:27
#71454 #71454
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Kalmuecke: Willst Du für jeden Ausdruck die Zeile in der der Ausdruck als erstes aufgetaucht ist oder willst Du nur die allererste Zeile, in der irgendeiner der Ausdrücke vorgekommen ist?
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/
Kalmuecke
 2006-11-06 14:28
#71455 #71455
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
@ Crian, aber meinst du nicht, das dann trotzdem Zeilen doppelt aufgenommen werden wenn mein Ausdruck in mehreren Zeilen vorhanden ist? Ich möchte ja nur, daß er mir einfach die erste speichert, da ich den Teil, den ich eigentlich brauche später so oder so noch extrahieren muss! Nur wie gesagt brauche ich nur eine Zeile in der mein Ausdruck drin vorkommt!
Crian
 2006-11-06 14:29
#71456 #71456
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Der Code speichert genau eine Zeile in dem Array, nämlich die erste auf die einer der regulären Ausdrücke passt. So hatte ich dich verstanden.
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
renee
 2006-11-06 14:29
#71457 #71457
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, wenn das mit last das Gewollte ist, dann braucht man kein Array, weil es dann sowieso nur ein Element gibt. Dann braucht man auch keinen Zähler, etc... Da kann man also "zusammenkürzen".
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/
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2006-11-06 12:08.