Stap 8: URI ontsnapt en hoe je om hen heen
Als u probeert uit te voeren van het script als is, u zult tegenkomen veel fouten van uw werkend systeem, en als je kijkt naar de bestandspaden die u probeert te verwijderen, kan je ongebruikelijke tekens ingesloten in de trajecten die ongewenst zijn. Er is een vrij goede kans dat deze paden URI-escape-tekens bevatten.Wat zijn URI ontsnapt? In HTML en XML, URI ontsnappen tekens (aka URI ontsnapt) zijn speciale metatekens gebruikt om te zoeken naar letterlijke exemplaren van dat karakter. U ziet bijvoorbeeld nooit een eenvoudige whitespace in een XML-tekenreeks. Echter, ziet u de XML-representatie van een eenvoudige whitespace, % 20. (Zeker u hebt gezien in de URL-balk in uw browser en wonder welke zij waren. Nou, nu je weet) bestaat A URI ontsnappen uit een %-teken gevolgd door een 2-cijferige hexadecimale code de ASCII-waarde van het teken.
Op dit punt, je zou kunnen schrijven een hele hoop vervangen verklaringen op de hash van de locatie ter vervanging van alle mogelijke metateken dat je tegenkomt (d.w.z. {$id} $loc_hash = ~ s/%20/ /; enzovoort). Gelukkig echter biedt Perl een betere manier om te zorgen voor deze dingen.
Perl wordt geleverd met een module met de naam URI::Escape, die heeft een ingebouwde functie, uri_unescape, die het werk van elliminating die de URI ontsnapt zal doen voor ons. Voor het gebruik van de module, voeg gewoon de volgende regel boven aan uw code:
use URI::Escape;
Nu, nadat we de array $loc_hash {$id} in de lus van het XML-bestand hebt toegewezen, kunnen we voegen de volgende regel daarna:
uri_unescape($loc_hash{$id});
De bovenstaande regel automatisch elliminates een URI-escape-tekens. Als een toegevoegde bonus vertaalt het aantal internationale tekens als goed. Ik rende het script met een paar filepaths dat had Japanse konji in hen, en de uri_unescape functie vertaald de XML-indelingen van deze tekens aan hun originele personages dus die ontkoppelen met succes naar de vijl wegvagen kon.
Alvorens verder te gaan, moet een extra stap worden genomen. Om redenen die ik niet begrijp, codeert iTunes de ampersandoperator (&) symbool als & in zijn tekenreeksen. Als iemand waarom dit is weet, laat het me weten. In de tussentijd, we elliminate dit probleem door het toevoegen van de volgende lijn onder de uri_unescape-lijn:
$loc_hash{$id} =~ s/&#/&/;
Het script zal nu filepaths duidelijk van vreemde karakters, en de koppeling verbreken functie zal kunnen vinden van bestanden in de juiste plaats om hen te schrappen. Nou, zal het als u gebruikmaakt van Mac OSX (en waarschijnlijk de meeste andere Unix-gebaseerde besturingssystemen zo goed). Lees verder voor het maken van het script compatibel op andere werkende systemen (namelijk, Windows).