Hvorfor virker denne sti ikke for at åbne en Windows-fil i PERL?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøgte at spille med Strawberry Perl, og en af ​​de ting, der stumpede mig, læste filerne.


Jeg forsøgte at gøre:


open(FH, "D:	est
umbers.txt");


Men det kan ikke finde filen (på trods af at filen er der, og ingen tilladelser udstedes).


En tilsvarende kode (100\% af scriptet bortset fra filnavnet var identisk) fungerede fint på Linux.

Bedste reference


Som Perl FAQ 5, skal du bruge fremad skråstreger i dine DOS/Windows-filnavne (eller, som et alternativ, undslippe backslashes). [6]



   Hvorfor kan jeg ikke bruge 'C: \ temp \ foo' i DOS-stier? Hvorfor virker ikke 't `C: \ temp \ foo.exe`?

  
  Ups! Du sætter bare en fane og en formular i det filnavn! Husk, at inden for dobbelt citerede strenge ('som dette') er backslashet et flugtegn. Den fulde liste over disse er i Citat og Citat-lignende Operatører i Perlop. Det er overraskende, at du ikke har en fil kaldet 'c: (tab) emp (formfeed) oo' eller 'c: (tab) emp (formfeed) oo.exe' på dit gamle DOS-filsystem.

  
  Du kan enten citere dine strenger eller (helst) bruge skråstreger. Da alle DOS- og Windows-versioner siden noget som MS-DOS 2.0 eller deromkring har behandlet/og \ det samme i en sti, kan du lige så godt bruge den, der ikke kolliderer med Perl - eller POSIX-skalen, ANSI C og C ++, awk, Tcl, Java eller Python, for blot at nævne nogle få. POSIX-stier er også mere bærbare.



Så din kode skal være open(FH, "D:/test/numbers.txt"); i stedet for at undgå at forsøge at åbne en fil med navnet 'D: < TAB > est \ numbers.txt'





Som en side kunne du yderligere forbedre din kode ved at bruge leksikalsk (i stedet for globalt navngivet) filhåndtering, en 3-argumenter form for åben, og vigtigst af alt, fejlsøgning ALLE dine IO-operationer, især open() kalder:


open(my $fh, "<", "D:/test/numbers.txt") or die "Could not open file: $!";


Eller endnu bedre, lad ikke hardkod filnavne i IO-opkald (den følgende praksis har muligvis lettet dig ud af et problem tidligere):


my $filename = "D:/test/numbers.txt";
open(my $fh, "<", $filename) or die "Could not open file $filename: $!";

Andre referencer 1


Brug aldrig interpolerede strenge, når du ikke behøver interpolation! Du forsøger at åbne et filnavn med et faneblad og en nylinjetegn i den fra \ t og \ n!


Brug enkelt citater, når du ikke har brug for (eller vil) interpolering.


Et af de største problemer, som nybegyndere Perl-programmører synes at løbe ind, er, at de automatisk bruger '' til alt uden at tænke. Du skal forstå forskellen mellem '' og '', og du skal ALTID tænke, før du skriver, så du vælger den rigtige. Det er en svært vane at komme ind i, men det er vigtigt, hvis du vil skrive godt Perl.