Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: ntz_reloaded 09 Července 2014, 17:56:35

Název: pouziti File::Stat v ruby
Přispěvatel: ntz_reloaded 09 Července 2014, 17:56:35
ahoj,

pracuju na prekodeni 1:1 neceho z perlu do ruby .. zasekl jsem se na tom, ze nejsem v ruby schopen vypsat normalni stat() (C-like eg sys/stat.h, perl-like stat(), whatever) ..

v podstate mam problem s timhle jednim vyrazem:

Kód: [Vybrat]
join(";", $file, stat("$file"))
muzete mi nekdo ukazat nejakej rubi one-liner kterej proste udela presne tohle:

Kód: [Vybrat]
# perl -e 'my $file = "/etc/hosts"; print join(";", $file, stat("$file")), "\n"'
/etc/hosts;64770;1051332;33188;1;0;0;0;1004;1404856621;1404461482;1404461482;4096;8

diky, ntz
Název: Re:pouziti File::Stat v ruby
Přispěvatel: jmp 09 Července 2014, 18:22:53
http://ruby-doc.org/core-1.9.3/File/Stat.html (http://ruby-doc.org/core-1.9.3/File/Stat.html)
Název: Re:pouziti File::Stat v ruby
Přispěvatel: ntz_reloaded 09 Července 2014, 19:24:30
http://ruby-doc.org/core-1.9.3/File/Stat.html (http://ruby-doc.org/core-1.9.3/File/Stat.html)
tohle znam uz nazpamet.

Copak nevidis co to dela s tema hodnotama ? Ja chci jen ten raw a ne tuhle hruzu.
Název: Re:pouziti File::Stat v ruby
Přispěvatel: jmp 09 Července 2014, 19:39:16
já to z toho špatně pochopil - přišlo mi to jako snaha naprogramovat něco, co je již obsaženo... (ale ani v jednom neprogramuju :-))
Název: Re:pouziti File::Stat v ruby
Přispěvatel: ntz_reloaded 10 Července 2014, 15:51:27
tak dik ubuntaci, ze jste mi pomohli ... uz to mam, ono to prekvapive dava pokazdy jiny hodnoty:

Kód: [Vybrat]
# ruby -e 'path= "/etc/hosts"; stat = File.stat(path); puts ([path] + [:dev,:ino,:mode,:nlink,:uid,:gid,:rdev,:size,:atime, :mtime, :ctime, :blksize,:blocks].map {|n| stat.send(n).to_i }).join(";")'
/etc/hosts;64770;1051332;33188;1;0;0;0;1004;1404979555;1404461482;1404461482;4096;8



# ruby -e 'path="/etc/hosts"; puts File.stat(path).inspect'
#<File::Stat dev=0xfd02, ino=1051332, mode=0100644, nlink=1, uid=0, gid=0, rdev=0x0, size=1004, blksize=4096, blocks=8, atime=2014-07-10 10:05:55 +0200, mtime=2014-07-04 10:11:22 +0200, ctime=2014-07-04 10:11:22 +0200>

opravdu nechapu ruby, co to je za dementni jazyk, kdyz stejna funkce uplne randomly dava dva formaty vystupu pro jednu hodnotu
Název: Re:pouziti File::Stat v ruby
Přispěvatel: GdH 10 Července 2014, 19:09:35
Co je na tom náhodnýho? inspect je metoda, která ti prostě vrátí data ve stringu už formátovaná pro uživatele a to včetně interpretace hodnot v pro ně typické číselné soustavě. 0x je prefix šestnáctkové a 0 osmičkové (btw stejně jako v Bashi), takže je jasno.  Pokud si vyžádáš hodnotu konkrétního parametru, vrátí ti ho daná metoda jako fixnum, string, nebo třeba aTime. fixnum je objekt, který obsahuje integer a jestli ho interpretuješ v desítkové, nebo šestnáctkové soustavě, je fuk, interně se s ním nakládá furt stejně. Výchozí pro převod integeru do stringu ale bývá soustava desítková, takže když budu chtít třeba parametr dev vypsat v jiné soustavě, musím si o to říct přidáním parametru:

Kód: [Vybrat]
puts(File.stat("/etc/hosts").dev.to_s(16))
mtime a další časové parametry jsou zase v objektu aTime, jehož výchozí převod do stringu dává human readable zápis času a  aby vyplivl integer, zase je třeba zavolat metodu, která to udělá.

Nikdy jsem v Ruby nic nedělal, jen jsem teď nahlíd do dokumentace.

Edit: upřesnění, doplnění, kurnik, já se fakt neumim vyjadřovat
Název: Re:pouziti File::Stat v ruby
Přispěvatel: ntz_reloaded 11 Července 2014, 10:28:48
@gdh .. hmm, aha .. no tak to se omlouvam .. ze .inspect dela neco s tema parametrama jsem si nevsiml
Název: Re:pouziti File::Stat v ruby
Přispěvatel: GdH 11 Července 2014, 12:50:30
Tady je třeba si uvědomit, že všechno, včetně jednoduchých datových typů, jako integer, jsou nějaké objekty, které mají nějaké metody (funkce). Co z nich leze, jaké datové typy, to je v dokumentaci. Ty v tom tvém onelineru děláš pár zbytečných operací navíc. Když už tam stejně máš výčet těch metod v seznamu, tak je rozumnější ho naplnit rovnou užitečnými hodnotami, bez další smyčky a zbytečných konverzí, třeba takto:

Kód: [Vybrat]
path="/etc/hosts"; s=File.stat(path); puts([path, s.dev, s.ino,s.mode, s.nlink, s.uid, s.gid, s.rdev, s.size, s.atime.to_i, s.mtime.to_i, s.ctime.to_i, s.blksize,s.blocks].join(";"))
Všechny hodnoty v seznamu budou int a při vstupu do join se automaticky zkonvertují do stringu.

Edit: Umazání zbytečných závorek - to_i() > to_i, Ruby je při volání metody nepotřebuje, když v nich není žádný argument.
Název: Re:pouziti File::Stat v ruby
Přispěvatel: ntz_reloaded 11 Července 2014, 13:23:48
aha o.O
Název: Re:pouziti File::Stat v ruby
Přispěvatel: Martin Šácha 11 Července 2014, 14:54:24
Edit: Umazání zbytečných závorek - to_i() > to_i, Ruby je při volání metody nepotřebuje, když v nich není žádný argument.

Ale fuj...
Název: Re:pouziti File::Stat v ruby
Přispěvatel: GdH 11 Července 2014, 15:18:18
Edit: Umazání zbytečných závorek - to_i() > to_i, Ruby je při volání metody nepotřebuje, když v nich není žádný argument.

Ale fuj...

Ze začátku mě to taky zmátlo, ale dokumentace hovoří jasně. A to ještě nejsou největší zvěrstva, ono je možné ty závorky vynechat i když argumenty jsou, pokud rovnou nepotřebuješ volat metodu výsledku :)