Schrift
[thread]11843[/thread]

externes File laden & variable ersetzen

Leser: 2


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
ack
 2008-05-20 09:30
#109956 #109956
User since
2008-05-20
3 Artikel
BenutzerIn
[default_avatar]
hi!

ich möchte eine textdatei laden, und die darin enthaltenen variablen durch die im script hinterlegten werter ersetzen.

etwa so:
$foo = "footext";

nun lade ich die textdatei mit dem inhalt:

"... text text text $foo text text $foo ..."

und möchte die darin angeführten $foo durch den zuvor definierten variablenwert ersetzen und ausgeben.

wie lässt sich das veranstalten?

greets
bloonix
 2008-05-20 10:51
#109957 #109957
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@Gwen, du schummelst ;-)

@ack, vielleicht möchtest du ein Template-System benutzen.
Schau mal auf CPAN nach...

CPAN:Template
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.
renee
 2008-05-20 10:54
#109958 #109958
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde zu einem Templating-System raten. Z.B. CPAN:HTML::Template::Compiled. Auch wenn dort "HTML" im Namen auftaucht, kann man das Modul auch für ganz normalen Text nehmen.

Aber zu Deiner Frage:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $file = 'template.txt';
my $foo = 'footext';
my $content = '';

{
    local $/;
    open my $fh, '<', $file or die $!;
    $content = <$fh>;
}

$content =~ s/\$foo/$foo/g;
print $content;


statt dem Block kannst Du auch einfach das hier schreiben:

Code (perl): (dl )
my $content = do{ local (@ARGV,$/) = $file; <> };
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/
GwenDragon
 2008-05-20 11:15
#109959 #109959
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
bloonix+2008-05-20 08:51:34--
@Gwen, du schummelst ;-)
Lieber mache ich den zu schnell getippten Unsinn weg als dass Anfänger das als korrekt ansehen.

Aber normalerweise kannst du in einem Regex Textteile durch evaluierten Code ersetzen.
Aber ich bin noch nicht ganz wach, denke ich:
Code (perl): (dl )
1
2
no strict;
$txt =~ s/\$([A-Za-z0-9_]+)/${$1}/eg;

sieht zwar gut aus, klappt aber nicht.
moritz
 2008-05-20 11:23
#109963 #109963
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Did you mean
Code (perl): (dl )
s/\$([A-Za-z0-9_]+)/$main::{$1}/eg;
GwenDragon
 2008-05-20 11:27
#109964 #109964
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Sowas dachte mein Hirn sowieso zum zweiten, aber das klappt so nicht.
renee
 2008-05-20 11:31
#109965 #109965
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn $foo global ist, dann geht's:

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

use strict;
use warnings;

my $content = do{ local $/; <DATA> };
our $foo = 'hallo';

no strict;
$content =~ s/\$(\w+)/${$1}/eg;
print $content;

__END__
text text $foo text $foo text 


Code: (dl )
1
2
C:\>perl test.pl
text text hallo text hallo text


Während mit "my":

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

use strict;
use warnings;

my $content = do{ local $/; <DATA> };
my $foo = 'hallo';

no strict;
$content =~ s/\$(\w+)/${$1}/eg;
print $content;

__END__
text text $foo text $foo text


Code: (dl )
1
2
3
4
C:\>perl test.pl
Use of uninitialized value in substitution iterator at test.pl line 10, <DATA> line 1.
Use of uninitialized value in substitution iterator at test.pl line 10, <DATA> line 1.
text text text text
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/
GwenDragon
 2008-05-20 11:32
#109968 #109968
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ich gebe es zu, noch keine Kaffee gehabt zu haben.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

$| = 1;

use strict;
use warnings;

our $test = 123; 
our $MOPS = 'mOpZ';
my $text = 'Ein $test ist gut! #
Oder $MOPS';
no strict;
$text =~ s/\$([A-Za-z0-9_]+)/'$'.$1/eegm;
print $text;


ergibt:
Ein 123 ist gut! #
Oder mOpZ


//EDIT: Ja, den Ärger mit my habe ich auch gerade gemerkt.
GwenDragon
 2008-05-20 11:35
#109969 #109969
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Wieso muss $foo mit our deklariert werden? Wo ist da die Falle?
moritz
 2008-05-20 11:48
#109971 #109971
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Update: Oh, ich sollte $text als '...' initialisieren. Danke pq, ich war zu blind ;-). Hab jetzt das Posting grob verändert ;)

GwenDragon+2008-05-20 09:35:45--
Wieso muss $foo mit our deklariert werden? Wo ist da die Falle?


Alle lexikalischen Variablen (also die, die mit 'my' deklariert werden) leben Außerhalb der Symboltabelle, und zwar im lexikalischen Pad.

Wenn man jetzt versucht über die Symboltabelle probiert auf eine my-Variable zuzugreifen sollte das fehlschlagen:

Code: (dl )
1
2
3
 perl -Mstrict -wle 'my $b = "test"; $_=q{a $b c};s/\$([A-Za-z0-9_]+)/$main::{$1}/eg; print'
Use of uninitialized value in substitution iterator at -e line 1.
a c


Anscheined macht auch ${var} den Umweg über die Symboltabelle.
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-05-20 09:30.