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

reguläre ausdrücke, array, ersetzen



<< >> 5 Einträge, 1 Seite
Gast Gast
 2007-09-28 13:36
#100106 #100106
hallo ich bin blutiger anfänger und habe eine für euch wohl recht einfache sache:

ich habe eine datei die ich zunächst einlese. dann habe ich meinetwegen eine stelle

test
test2

irgendwo in der datei, die ich als array eingelesen habe
use strict;

############################
#Datei einlesen
############################
open(input, "<input.inp"); # File öffnen; nur zum Lesen
my @lines = <input>; # in Array einlesen
close(input);

so, jetzt möchte ich mittels eines regulären ausdruckes die stelle zwischen test und test2 ermitteln und in diese einen neuen textbaustein einfügen
zunächst einmal teste ich ob er überhaupt die zeile findet mit

if(@lines =~ /(test)\n(test2)/)
{
print "yeah"
};

so und nachdem hier keine ausgabe kommt scheint doch hier der fehler zu liegen? mit dem regex coach klappt der reguläre ausdruck wunderbar nur hier nicht.

ich hab die vermutung dass es daran liegt, dass ich einen array und keine skalare variable einlese. definiere ich nämlich

$test = "test
test2";
und baue es entsprechend um funktioniert es.

vielen dank für eure hilfe!
max
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.
bloonix
 2007-09-28 15:07
#100120 #100120
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Das einzige Problem ist, das auf jeden Fall eine neue Datei geschrieben wird.
Es ist also keine Prüfung vorhanden, ob die Datei überhaupt neu geschrieben
werden muss...
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.
Gast Gast
 2007-09-28 17:13
#100135 #100135
wow! super und vielen dank für diese antwort. hat mir sehr geholfen, danke schön!
bloonix
 2007-09-28 18:20
#100139 #100139
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Das es dir geholfen hat, kann man erst feststellen,
wenn du uns zeigst, wie du es jetzt machst.

Lass mal sehen ...
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.
<< >> 5 Einträge, 1 Seite



View all threads created 2007-09-28 13:36.