/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Backslash problem
Fra : Jens H. Nielsen


Dato : 06-11-01 09:49

Hej NG.

Nedeståene kode virker hvis der er 2 backslashs ved hver
backslash i $text. Men hvordan laver man en sådan TR kommando.
Eller er der en nemere måde at få fat i fil navnet ?

Tak for hjælpen.
Jens

$text = "G:\images\students\thomas_anderson.jpg";
while ($text=~ /\\/g){ #loop'er igennem strengen
$text=$'; #skær *\ fra strengen
}
print $text;




 
 
Morten Brix Pedersen (06-11-2001)
Kommentar
Fra : Morten Brix Pedersen


Dato : 06-11-01 11:04

Jens H. Nielsen wrote:

> Hej NG.
>
> Nedeståene kode virker hvis der er 2 backslashs ved hver
> backslash i $text. Men hvordan laver man en sådan TR kommando.
> Eller er der en nemere måde at få fat i fil navnet ?


Jeg ville gøre det sådan her, det er måske ikke det mest optimale, men
det virker:


$text = 'G:\images\students\thomas_anderson.jpg';

if ($text =~ /.*\\(.*)$/) {
$text = $1;
}


Bemærk at jeg ændrede dine gåseøjne i $text = ... til single quotes ('),
med gåseøjnene ville Perl interpolere strengen og behandle \ specielt
(ligesom når du skriver \n).



- Morten.

--
Morten Brix Pedersen morten@wtf.dk
www.wtf.dk


Jens H. Nielsen (06-11-2001)
Kommentar
Fra : Jens H. Nielsen


Dato : 06-11-01 11:07

1000 tak Morten

Morten Brix Pedersen wrote:

---snip---
>
>
> Bemærk at jeg ændrede dine gåseøjne i $text = ... til single quotes ('),
> med gåseøjnene ville Perl interpolere strengen og behandle \ specielt
> (ligesom når du skriver \n).
>
>
>
> - Morten.
>


wulff (06-11-2001)
Kommentar
Fra : wulff


Dato : 06-11-01 11:27

>Nedeståene kode virker hvis der er 2 backslashs ved hver
>backslash i $text.
Problemet er at din text står i "..." det betyder at \s bliver
opfattet som mellemrum og \t som tabulator. Derfor er du nødt til at
escape dine backslashes for at det virker (som du selv skriver).

>Eller er der en nemere måde at få fat i fil navnet ?
Det kunne f.eks. gøres på følgende måde:

$text = 'G:\images\students\thomas_anderson.jpg';

$text =~ s/.*\\(.*)/$1/;

print $text;


/wulff

R. A. Larsen (06-11-2001)
Kommentar
Fra : R. A. Larsen


Dato : 06-11-01 20:21

"Jens H. Nielsen" <jens@ichiban.dk> wrote:
>
> Hej NG.
>
> Nedeståene kode virker hvis der er 2 backslashs ved hver
> backslash i $text. Men hvordan laver man en sådan TR kommando.
> Eller er der en nemere måde at få fat i fil navnet ?

Husk at perl stammer fra UNIX-verdenen, hvor man bruger tegnet
'\' som "escape"-tegn, dvs. det næste tegn har en speciel mening.
Hvis du for eksempel skal skrive et tabulator-tegn kan du skrive
'\t'. Det betyder samtidigt, at du skal skrive '\' to gange for
at få et enkelt.

Hvor kommer det filnavn egentlig fra? Husk at du i perl under
Windows kan skrive stier med enten '\\' eller '/'.

Nu til dit spørgsmål: En kortere måde kunne være:

$text = "G:\\images\\students\\thomas_anderson.jpg";
$text =~ s/.*\\//g;

'.*\\' fanger alle tegn, der efterfølges af et '\'. Det erstattes
så af 'ingenting'. Det sidste 'g' betyder at vi skal blive ved så
længe der er en match.

Se: 'perldoc perlop' under 's/PATTERN/REPLACEMENT/egimosx'.

Hvis du hellere vil skrive det portabelt, kan du i stedet bruge
standard-modulet "File::Basename":

use File::Basename;

$fullname = "G:\\images\\students\\thomas_anderson.jpg";
print "[$fullname]:\n";

($name,$path) = fileparse($fullname,'');
print "\t[$name] [$path]\n";

Se: 'perldoc File::Basename'.

Begge metoder er afprøvet og virker fint hos mig (ActiveState
Perl 5.6.1, build 629).

MVH, René
--
Using Virtual Access
http://www.vamail.com


Lasse Hillerøe Peter~ (10-11-2001)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 10-11-01 21:12

In article <VA.0000012d.0024dcbb@r_larsen>, r_larsen@image.dk wrote:

>Nu til dit spørgsmål: En kortere måde kunne være:
>
> $text = "G:\\images\\students\\thomas_anderson.jpg";
> $text =~ s/.*\\//g;
>
>'.*\\' fanger alle tegn, der efterfølges af et '\'. Det erstattes
>så af 'ingenting'. Det sidste 'g' betyder at vi skal blive ved så
>længe der er en match.

I og med at du bruger en greedy wildcard, matcher du op til *sidste*
forekomst af backslash, så det g er overflødigt (og misvisende.) Der skal
klogere hoveder end mig til at fortælle om den backtracking der sker her,
i visse situationer kan være et problem. Her er det nok minimalt. Men .*
scanner altså først til enden af strengen, hvorefter Perl backtracker
indtil der er noget tilbage der matcher en backslash.

-Lasse

R. A. Larsen (11-11-2001)
Kommentar
Fra : R. A. Larsen


Dato : 11-11-01 09:38

lhp+news@toft-hp.dk (Lasse Hillerøe Petersen) wrote:
>
> I og med at du bruger en greedy wildcard, matcher du op til *sidste*
> forekomst af backslash, så det g er overflødigt (og misvisende.) Der skal
> klogere hoveder end mig til at fortælle om den backtracking der sker her,
> i visse situationer kan være et problem. Her er det nok minimalt. Men .*
> scanner altså først til enden af strengen, hvorefter Perl backtracker
> indtil der er noget tilbage der matcher en backslash.

Du har fuldkommen ret. Det 'g' var efterladt efter en anden test af samme udtryk.
I denne test var 'g' nødvendig.

MVH, René
--
Using Virtual Access
http://www.vamail.com


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste