Thread reguläre ausdrücke, array, ersetzen (4 answers)
Opened by Gast at 2007-09-28 13:36

bloonix
 2007-09-28 14:59
#100118 #100118
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Gast,

bitte verwende use strict; und use warnings; in deinem Code!

Bitte prüfe auch den Returnwert von open():
Code: (dl )
open(input, "<input.inp") or die "unable to open input.inp: $!";

Die Verwendung einer lexikalischen Variable ist vorzuziehen:
Code: (dl )
open(my $FH, "<input.inp") or die ...


Wenn die Datei sehr klein ist, dann könnte man es eventuell so lösen wie
du es vorhast, allerdings dann nicht mit @lines sondern mit $lines und der
Regex fehlt noch ein wenig. Bei größeren Dateien könnte man es so lösen:

Code (perl): (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
use strict;
use warnings;
use Fcntl qw/O_RDONLY O_WRONLY O_CREAT O_EXCL/;

my $cur_file = 'foo.txt';
my $tmp_file = 'foo.txt.tmp';

sysopen my $in, $cur_file, O_RDONLY or die "unable to open foo.txt: $!";
sysopen my $out, $tmp_file, O_WRONLY | O_EXCL | O_CREAT or die "unable to open foo.txt.tmp: $!";

my $start_pos;
my $replacement = "Hello World\n";

while (my $line = <$in>) {
    print $out $line;
    if ($line =~ /^test$/) {
        my $hit = 0;
        $start_pos = tell($in);
        while (my $line = <$in>) {
            if ($line =~ /^test2$/) {
                $hit++;
                print $out $replacement;
                print $out $line;
                last;
            }
        }
        unless ($hit) {
            seek($in, $start_pos, 0);
        }
    }
}

close $in;
close $out;

rename($tmp_file, $cur_file)
    or die "unable to rename $tmp_file to $cur_file";
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.

View full thread reguläre ausdrücke, array, ersetzen