URLencode a URLdecode pre Perl

Bude sa hodiť mať ekvivalent funkcie urldecode a urlencode v Perle. Nemôžem sa chváliť desiatkami tísic riadkami, pretože Perl to má nakoniec jednoregulárny výraz. Zasa sakra.


*Perl sample source code for encode and decode text to URI formated string:*
Odkódovanie reťazca z URL formy:

sub URLDecode {
my $theURL = $_[0];
$theURL =~ tr/+/ /;
$theURL =~ s/%([a-fA-F0-9]{2,2})/chr(hex($1))/eg;
$theURL =~ s///g;
return $theURL;
}

Zakódovanie reťazca do formy vhodnej pre URL:

sub URLEncode {
my $theURL = $_[0];
$theURL =~ s/([\W])/"%" . uc(sprintf("%2.2x",ord($1)))/eg;
return $theURL;
}

Zdroj vrátane myšlienkového pochodu pri hľadaní: Google Search, Audio::Scrobbler a odtiaľ na Encoding and Decoding URLs via perl (including decimal to hex conversion)
Na námet predošlého príspevku o PHP v kontraste s Perlom.
Poznámka: Takto som uviedol zdroj v kontexte debaty o „slušnom“ zodpovedaní „neslušne formulovaných“ problémov.

Môže sa Vám ešte páčiť...

8 komentárov

  1. 2ge píše:

    asi by som si mal tiez zalozit blog a napisat par perlovskych perliciek, ktore sa vzdy zidu :)
    napriklad minule som potreboval spravit v php odstraneni diakritiky z UTF znaku (ano, na SEO URL), tak som sa s tym trapil asi hodinku, nakonieco to nie je tazke (http://sk2.php.net/manual/en/function.utf8-decode.php), ale oproti perlovskemu: use Unicode::Normalize;
    use Encode;
    $string = „+lšctžýáíé test“;
    $string = decode(„windows-1250“, $string);
    $string = NFD($string);
    $string =~ s/\pM//og;
    print $string;
    __END__ samozrejme sa to da skratit…

  2. rony píše:

    vidis a ja som si riesil to iste ale jednym tr :-) ale ta tabulka bola komplet vsetky znaky zasa…
    koniec koncov prevodnik v PHP by si nasiel kdesi v archive Spravodaja :-)

  3. Kozo píše:

    ja mam nieco taketo:
    s/([^a-zA-Z0-9_.-])/uc sprintf(„%%%02x“,ord($1))/eg;
    (plus omacka okolo toho)
    Z Tvojho kodu by som vypustil posledny return vo funkciach a spolahol sa na manual: Note that in the absence of an explicit „return“, a subroutine, eval, or do FILE will automatically return the value of the last expression evaluated.

  4. rony píše:

    ja som taky perlovy pojedac kolacov nauceny na sladke z Pascalu ;-) takze ma uspokoji prvy spravny vysledok ;-)
    Asi budem zdrojaky uverejnovat castejsie ;-)

  5. FrozenDog píše:

    K perlu som zatial ani nepricuchol, ale v poslednej dobe (ako si o tom zacal pisat) ma to zacina neuveritelne lakat. Nemas nejaky tip, kde by som mal zacat? Vdaka.

  6. rony píše:

    mno je to tazsie, na windowse na hranie sa je dobry ActivePerl.
    Treba sa odputat od toho, ze je to jazyk pre web. Moze byt ale nie je.
    Ja som svojho casu zacinal s manualmi na http://www.manualy.sk ale videl som kdesi knizky v cestine. Mne sa ale najlepsie osvedcila knizka o’reilly CGI rohrani (presny nazov neviem) ale boli tam veci, ktore som ja presne potreboval.
    Ak robis CGI (webove skripty) v perle, tak je to mierne zlozitejsie ako PHP (ktore je vlastne len nadstavba nad HTML – vsuvanim PHP kodu do zdrojaku HTML).
    V Perle pises perlovy kod, ktory zhodou okolnosti moze vystup smerovat naformatovany ako HTML cez HTTP tym, ze si webovy server pripravis na interpretovanie CGI v Perle.

  7. Ivan píše:

    2ge, ja som myslel ze utf8_decode je nepouzitelna. Nahradzuje nezname znaky „?“, teda aspon mne, napr. „š“.

  8. 2ge píše:

    [7] mne to zatial pracuje dobre, precitaj si k tomu manual, ide o to, ze musis potom este skonvertit latin1 na ascii, hodil som tam aj moj skript do toho manualu.
    [5] ja som sa ucil z Perl za 30 dni, ci ako to bolo, vydal to SAM’s a pisala to nejaka anglicanka. Inac je mat dobre na kompe nejaky help, ja mam CHM a tam su tusim 4 knihy od reilly, velmi dobre typy, onelinery a riesenia na klasicke problemy.
    [3] co sa tyka returnu, tiez ho radsej pouzivam, problem pri perli je jeho citatelnost. Nie je umenie kodovat tak, ze to po sebe precitas len ty, ale umenie je spravit prehladny neroztahany kod. Napriklad mne sa strasne paci styl kodovania Randyho Schwarza. return je taka klasika :)