Schrift
[thread]8742[/thread]

String durch Referenz ersetzen



<< >> 8 Einträge, 1 Seite
bloonix
 2007-02-08 19:50
#74187 #74187
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Community,

wie kann ich einen String durch eine Referenz ersetzen?

Beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $foo    = ();
my $bar    = \$foo;
my $string = 'hello <--REPLACE-->';

# das klappt natürlich nicht
$string =~ s/<--REPLACE-->/$bar/;

$foo = 'world';
print $string, "\n";

$foo = 'community';
print $string, "\n";


Als Ausgabe erwarte ich

hello world
hello community


Wie kann ich sowas realisieren?

Gruss,
opi
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
 2007-02-08 20:31
#74188 #74188
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So könnte man es realisieren:
Code: (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
#!/usr/bin/perl

use strict;
use warnings;

package RefReplacer;

use overload '""' => \&replace;

my $self;

sub new{
my ($class,$string) = @_;
$self = {};
bless $self,$class;
$self->string($string);
return $self;
}

sub string{
my ($self,$string) = @_;
$self->{string} = $string if defined $string;
return $self->{string};
}

sub pattern{
my ($self,$pattern,$ref) = @_;
$self->{pattern}->{$pattern} = $ref;
}

sub replace{
my $string = $self->string;
for my $pat(keys %{$self->{pattern}}){
my $ref = $self->{pattern}->{$pat};
$string =~ s/$pat/$$ref/g;
}

return $string;
}

package main;

my $foo = ();
my $bar = \$foo;
my $string = RefReplacer->new('hello <--REPLACE-->');
$string->pattern('<--REPLACE-->',\$foo);

# das klappt natürlich nicht

$foo = 'world';
print $string, "\n";

$foo = 'community';
print $string, "\n";
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/
renee
 2007-02-08 20:33
#74189 #74189
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn man beliebige Pattern verwenden will, muss es natürlich
Code: (dl )
        $string =~ s/\Q$pat\E/$$ref/g;
heißen...
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/
pq
 2007-02-08 20:44
#74190 #74190
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,08.02.2007, 18:50]Wie kann ich sowas realisieren?[/quote]
mit templates
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2007-02-09 02:23
#74191 #74191
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,08.02.2007, 19:31]
Code: (dl )
$string =~ s/$pat/$$ref/g;
[/quote]
Hallo Renee,

so mache ich das im Moment auch nicht anders. Genau das ist es aber
was ich nicht möchte. Hier wird jedemal eine Regex angeschmissen,
um $pat durch $$ref zu ersetzen, dies möchte ich aber nur ein einziges
Mal machen... deshalb dachte ich zuerst an eine Refererenz.

Eventuell wäre es möglich, <--REPLACE--> durch CODE zu ersetzen,
der jedesmal ausgeführt wird, wenn $string interpoliert wird.

Sorry, das ich mich so unglücklich ausdrücke. :)

Gruss,
opi\n\n

<!--EDIT|opi|1170980738-->
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
 2007-02-09 10:58
#74192 #74192
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das wäre wohl nur durch ein String-eval möglich. Und das ist wohl eher nicht das was man will, oder?

Aber was ist der große Unterschied dabei, ob jedesmal eval (oder ein anderes Konstrukt) oder die RegEx-engine verwendet wird?
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/
pq
 2007-02-09 11:44
#74193 #74193
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,09.02.2007, 01:23]Hier wird jedemal eine Regex angeschmissen,
um $pat durch $$ref zu ersetzen, dies möchte ich aber nur ein einziges
Mal machen...[/quote]
wenn du die overload-lösung ein wenig umschreibst, wird nicht mehr
jedesmal eine regex angeworfen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-02-09 11:47
#74194 #74194
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@renee: wieso ist bei dir $self eine "globale" variable? sowas ist doch
nur bei signletons sinnvoll und verwirrt meiner meinung nach leser,
die das für ein typisches OO-beispiel halten.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 8 Einträge, 1 Seite



View all threads created 2007-02-08 19:50.