Schrift
[thread]13072[/thread]

Datei lesen und schreiben

Leser: 1


<< >> 5 Einträge, 1 Seite
Gast Gast
 2009-01-28 22:25
#118450 #118450
Hallo zusammen,

ich habe folgende Datei

####################
# Testdatei
####################
[VARIABLE]
UPDLEVEL=111
DATA=C:\test\test123
DIR=C:\test\333
INI=C:\test\test.ini

Ich möchte die Nummer 111 mit einer anderen schon vorhandene Variable ersetzen.
Die anderen Zeilen der Datei müssen so bleiben wie sie sind.
Kann mir jemand helfen?
Danke im voraus?
renee
 2009-01-28 23:19
#118455 #118455
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das sieht mir sehr nach dem .ini-Format aus. Da kannst Du mit CPAN:Config::IniFile die Datei einlesen, den neuen Wert setzen und mit dem Modul wieder rausschreiben.

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

use strict;
use warnings;
use Config::IniFiles;

my $file = 'test.ini';

my $ini = Config::IniFiles->new( -file => $file );
$ini->setval( 'VARIABLE', 'UPDLEVEL', 'neuer Wert' );
$ini->WriteConfig( $file );


Oder Du machst es mit CPAN:Tie::File:

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

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

my $file = 'test.ini';

tie my @lines, 'Tie::File', $file or die $!;
for my $line ( @lines ){
    if( $line =~ /^UPDLEVEL/ ){
        $line = "UPDLEVEL=neuer Wert\n";
        last;
    }
}
untie @lines;
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/
Gast Gast
 2009-01-29 18:04
#118515 #118515
Was sagt ihr zu meinem Konfigurationsfileskript?

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/perl
use warnings;
use strict;


my $file;
my %hash = ();
my $key = '';
my %kon = ();
my @kontrolle = ();
my $count = 0;


while ( defined ( my $line = <DATA> ) ) {
        chomp ( $line );
        if ( $line =~ /^\s*#/ || $line =~ /^\s*$/ ) {
                next;
        }
        elsif ( $line =~ /^\s*Datei\s*=\s*'(.*)'/ ) {
                if ( $file ) {
                        write_to_file ( $file );
                        %hash = ();
                }
                $file = $1;
                if ( ! -f $file ) {
                        open ( my $fh_w, '>>', $file ) or die "$file $!";
                        close ( $fh_w );
                }
                open ( my $fh, '<', $file ) or die "$file $!";
                while ( <$fh> ) {
                        chomp;
                        next if $_ =~ /^\s*#/ || $_ =~ /^\s*$/;
                        if ( /^\s*\[([^\]]+)\]/ ) {
                                $key = $1;
                                next;
                        }
                        my ( $k, $v ) = split /\s*=\s*/;
                        ${$hash{$key}}{$k} = $v;
                }
                close ( $fh );
        } else {
                if ( $line =~ /^\s*\[([^\]]+)\]/ ) {
                        $key = $1;
                        next;
                }
                my ( $k, $v ) = split /\s*=\s*/, $line;
                ${$hash{$key}}{$k} = $v;
                $kon{$k}++;
        }
}

write_to_file ( $file );

sub write_to_file {
        my $file = shift;
        open ( my $fh_write, '>', $file ) or die "$file $!";
                        foreach my $key ( sort keys %hash ) {
                                print $fh_write "[$key]\n";
                                foreach my $k ( sort keys %{$hash{$key}} ) {
                                        foreach ( keys %kon ) {
                                                push ( @kontrolle, [ $file, $key, $k, ${$hash{$key}}{$k} ] ) if $_ eq $k;
                                        }
                                        print $fh_write $k, "=", ${$hash{$key}}{$k}, "\n";
                                }
                        }
        close ( $fh_write );
}

my $dat = '0';
foreach ( sort { $a->[0] cmp $b->[0] || $a->[2] cmp $b->[2] } @kontrolle ) {
        print "\n" if $dat ne $_->[0];
        print "$_->[0]\t: $_->[2]=$_->[3] [$_->[1]] \n";
        $dat = $_->[0];
}


__DATA__
Datei = '/home/manfred/.kde/share/config/kdesktoprc'
[FMSettings]
ShowFileTips=false
[ScreenSaver]
Enabled=false

Datei = '/home/manfred/.kde/share/config/konquerorrc'
[FMSettings]
ShowFileTips=false
[Trash]
ConfirmTrash=false


Linuxer
 2009-01-29 18:12
#118516 #118516
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
Sehr gut, dass Du "warnings" und "strict" verwendest.
Klärende Kommentare im Skript fehlen gänzlich, eher schlecht.
Ein paar klärende Worte, was Du mit dem Skript bezwecken willst, wären auch sehr hilfreich.

Tiefer hab ich in das Skript noch nicht gesehen...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2009-01-29 19:45
#118520 #118520
Ups, warum hab ich das gepostet?


Ich weis nicht mehr, mit welchen Modulen ich es versucht habe und was mir alles nicht gepasst hat.
Mein Ziel war es, verschiedene Einstellungen in einer Datei zu speichern und bei Bedarf (z.B Neuinstallation) die Einstellungen in den Configurationsfiles damit zu modifizieren bzw. hinzuzufügen ohne dass es zu doppelten Einträgen kommt.
<< >> 5 Einträge, 1 Seite



View all threads created 2009-01-28 22:25.