[Perl] Pattern match

Pagina: 1
Acties:

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 17:05
Ik probeer het volgende (wat dus niet lukt)... :(

code:
1
2
3
4
my $file = "ditiseenfile.c";
my $pattern = "dit\(\.\*\).c";
my $replace = "dit\$1\.cpp";
$file =~ s/$pattern/$replace/;


De uiteindelijke waarde van $file wordt nu 'dit$1.cpp' ipv 'ditiseenfile.cpp'....

Hoe los ik dit op??

(Dit is een soortgelijke situatie als in mijn script waar ik patterns en replacements variabel opgeef)...

Verwijderd

Rowwan schreef op 27 september 2002 @ 07:53:
Ik probeer het volgende (wat dus niet lukt)... :(

code:
1
2
3
4
my $file = "ditiseenfile.c";
my $pattern = "dit\(\.\*\).c";
my $replace = "dit\$1\.cpp";
$file =~ s/$pattern/$replace/;


De uiteindelijke waarde van $file wordt nu 'dit$1.cpp' ipv 'ditiseenfile.cpp'....

Hoe los ik dit op??

(Dit is een soortgelijke situatie als in mijn script waar ik patterns en replacements variabel opgeef)...
code:
1
my $replace = "dit\$1\.cpp";


escape de $ s niet, dus
code:
1
my $replace = "dit$1\.cpp";
werkt t dan?

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 17:05
Nope :(

Verwijderd

Waarom stop je dee regexes eerst in een variabele voor je ze gebruikt? Dat is als ik het mij goed herinner trager als je de regex meerdere malen uitvoert:
code:
1
$file =~ s/dit(.*)\.c/dit$1.cpp/;

Zou moeten werken denk ik.

Verwijderd

my $file = "ditiseenfile.c";
$file =~ s/.c/.cpp/;

is volgens mij het enigste wat je nodig hebt.

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 17:05
In dit geval heb je gelijk... maar ik heb al meerdere files waarin meerdere patterns en meerdere expressies voorkomen (met andere woorden: ALLES is variabel...)

Verwijderd

Dan zou je het beste kunnen beginnen door het uit elkaar te trekken.
Dus eerst je bestandsnaam te vervangen en dan pas je file extensie te vervangen.
Als dat lukt dan kan je gaan proberen om de 2 te gaan combineren

  • Juup
  • Registratie: Februari 2000
  • Niet online
Perl:
1
2
3
my $replace1 = "dit";
my $replace2 = "\.cpp";
$file =~ s/$pattern/$replace1$1$replace2/;

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 17:05
Voor iemand de nog geinteresseerd is. Het volgende is het resultaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $pattern = "*World*";
my $replacement = "*Moon*";
my $file = "Hello World!";

$pattern =~ s/\*/\(\.\*\)/g;            # replace * with (.*)
my @filelist = split /$pattern/, $file;
my $nList = scalar( @filelist);

my $newfile = $replacement;
for ( my $i=1; $i <= $nList; $i++)
{
    $newfile =~ s/\*/$filelist[$i]/;
}
print "$file -> $newfile\n";
Pagina: 1