f = File.new("soubor.txt") s = f.readnebo zkráceně
s = File.new("soubor.txt").readnež v Perlu
local $/ $s = <soubor.txt>Ale proti gustu žádný dišputát. Je to jen můj osobní názor.
LABEL while (EXPR) BLOCK LABEL while (EXPR) BLOCK continue BLOCKNerozumím co se myslí pojmem "šoupat kolem". Samozřejmě to jde v daném bloku uložit do jakékoli proměné, případně s tím dělat i jiné skopičiny. Použité
my
způsobí, že proměnná $filename
existuje pouze uvnitř EXPR, BLOCK a continue BLOCK.
use strict; use warnings; # long time wanted perl function :-) sub map2 (&\@\@) { my ($sub,$f,$s) = @_; map { local (*a, *b) = (\$f->[$_], \$s->[$_]); &$sub } (0..$#$f); } # data my @a1=(1,2,3); my @a2=(4,5,6); # output modification $\="\n"; $"=','; # use and output print "map2 result: ", join $", map2 {$a + $b++} @a1, @a2; print "a1: @a1"; print "a2: @a2";
import sys, os from os.path import split, join for fPath in sys.argv: fDir, fName = split(fPath) newPath = join(fDir, fName.lower()) os.rename(fPath, newPath)Ale není to nejlepší řešení, protože to nebude fungovat u znaků s diakritikou. Dnes se používá kódování utf-8 a v něm je znak s diakritikou zapsán jako více znaků, což ale metoda lower() netuší, ona se na každý znak dívá samostatně. Řekl bych, že to samé s týká i příkladu pro Ruby, ne? V Pythonu je ale náprava jednoduchá:
import sys, os from os.path import split, join for fPath in sys.argv: fDir, fName = split(fPath) newPath = join(fDir, fName.decode('utf-8').lower()) os.rename(fPath, newPath)Zajímalo by mě řešení v Ruby i Perlu funkční i pro názvy s diakritikou.
import sys, os from os.path import split, join coding = sys.stdin.encoding for fPath in sys.argv: fDir, fName = split(fPath) newPath = join(fDir, fName.decode(coding).lower()) os.rename(fPath, newPath)Doufám že milovníci Ruby neodpadli hned v počátku a také nám předvedou implementaci.
use locale; use utf8; use File::Spec; foreach (@ARGV) { my ($volume, $path, $name) = File::Spec->splitpath($_); $name =~ s,([^/]*$),lc $1,eo; rename $_, File::Spec->catpath($volume, $path, $name); }Opět při správně nastaveném systému by celá procedura měla proběhnout i bez opičinek s encode/decode.
use locale; use utf8; use File::Spec; foreach (@ARGV) { my ($volume, $path, $name) = File::Spec->splitpath($_); $name = lc $name; rename $_, File::Spec->catpath($volume, $path, $name); }Jestliže ARGV položka bude získána jako unicode, lc převede string jako unicode, pokud ne, akceptuje se nastavení podle locale.
Jestliže ARGV položka bude získána jako unicode, lc převede string jako unicode, pokud ne, akceptuje se nastavení podle locale.tak jsem se domníval, že locale se použije jen pokud ARGV se nezíská jako unicode. To mi přišlo divné.