Leser: 1
|< 1 2 3 >| | 29 Einträge, 3 Seiten |
QuoteWarum kann ich aber nicht direkt mit while() auf das Handle "LISTE" zugreifen?
Quoteopen LISTE, "list.txt";
my @liste=<LISTE>;
QuoteDies produziert mir: "Use of uninitialized value in pattern match (m//) at ./test.pl line 13, <LISTE> line 1". Muss ich immer unbedingt den "Umweg" über "@liste" machen?
1
2
3
4
5
6
7
8
9
10
Hier steht irgendwas
bla
a=3,b=4,c=17,d=19
a=5,b=7,c=62,d=33
a=16,b=9,c=77,d=49
a=98,b=10,c=234,d=213
a=130,b=27,c=567,d=333
a=234,b=56,c=1024,d=789
a=444,b=231,c=1079,d=987
blub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl -w
use strict;
die "$0: VALUE MIN MAX\n" if @ARGV != 3;
my ($key, $min, $max) = @ARGV;
open LISTE, "<", "liste.txt" or die $!;
while ( <LISTE> )
{
if ( m/$key=(\d+)/o )
{
print if $1 >= $min && $1 <= $max;
}
}
close LISTE;
QuoteDies produziert mir: "Use of uninitialized value in pattern match (m//) at ./test.pl line 13, <LISTE> line 1". Muss ich immer unbedingt den "Umweg" über "@liste" machen?
Quote- Der reguläre Ausdruck, den du verwendest um die Eingabezeilen auszuwerten, funktioniert, denke ich, nicht immer. Zum Beispiel kriegst du da Probleme, wenn eine Variable in deinen Eingabezeilen 'foo' heißt und jemand an der Kommandozeile angibt, dass nach 'o' gesucht werden soll. Dann erwischt dein regulärer Ausdruck immer auch 'foo'...
die "Erstes Argument muss [a-d] sein\n" unless $key =~ m/^[a-d]$/;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w
use strict;
die "$0: VALUE MIN MAX\n" if @ARGV != 3;
my ($key, $min, $max) = @ARGV;
die "Erstes Argument muss [a-d] sein!\n" unless $key =~ m/^[a-d]$/i;
$key = lc $key;
open LISTE, "<", "liste.txt" or die $!;
while ( <LISTE> )
{
if ( m/$key=(\d+)/o && $1 >= $min && $1<= $max )
{
print;
}
}
close LISTE;
Quotereadline() on closed filehandle LISTE at ./liste.pl line 14.
der code:
open FH, "list.txt";
close(FH);
while(<FH>){
print;
}
1
2
3
4
5
my @lines;
{
open my $in, '<', 'list.txt' or die "Fehler beim Öffnen der Eingabedatei: $!\n";
@lines = <$in>;
}
Quotemehrere Antwortende sagten hier, dass ich das Filehandle sofort, also noch for dem while() schliessen soll. Wie soll dann aber daraus gelesen werden, wenn es geschlossen ist? Ich habe es natürlich ausprobiert und tatsächlich, wenn ich for dem while() das Filehandle close, bekome ich aber folgendes:
QuoteSieht also aus und ist für mich logisch, dass man doch erst nach der Operation close'n kann, oder galt das für den Fall, wenn man ein Array gefüllt hat ( also FH öffnen, @liste füllen, FH closen, while(@liste)), dann muss ich aber wieder mit $_=shift(@liste) innerhalb von while() arbeiten und das wurde ja von Euch auch abgeraten, weil man besser mit dem Filehandler arbeiten soll... hmm... ? :confused:
Quotesid burn erwähnte aber, dass dieses "auf einmal in ein Array Einlesen", bei grösseren Dateien nicht gut wäre. Es leuchtet mir ein, dass wie Du sagtest, mit meiner Variante "der globale Namensraum mit einem Filehandle verschmutzt wird", allerdings scheint mir das Argument das Problems mit dem "auf einmal Einlesen in ein Array" grösser, als der Vorteil des Sauberhaltens des globalen Namensraums, oder habe ich es hier wieder falsch verstanden?
1
2
3
4
5
6
7
8
#!/usr/bin/perl
use strict;
use warnings;
die "usage: skript b 3 19 file.log\n" if @ARGV != 4;
my ($key, $min, $max) = splice @ARGV, 0, 3;
/,$key=(\d+)/ && $1 >= $min && $1 <= $max && print while (<>);
m/(^|,)\s*$key\s*=\s*(\d+)/
|< 1 2 3 >| | 29 Einträge, 3 Seiten |