sous Unix - Structures [Perl] - Programmation
Marsh Posté le 01-02-2002 à 17:58:32
Ok, j'ai reussi a trouve comment on lit une structure...
Un petit unpack en binmode a l'air de marcher
Le probleme est que je n'arrive pas a bien recuperer les donnees...
Marsh Posté le 01-02-2002 à 21:01:00
ReplyMarsh Posté le 01-02-2002 à 22:23:13
open(WTMP , $file);
/* ouverture du fichier */
$i = 0;
while (sysread(WTMP, $buf, 36))
{
($wtmp[$i]{tty} , $wtmp[$i]{name} , $wtmp[$i]{host} , $wtmp[$i]{time}) = unpack('A8A8A16L4', $buf); /* regarde les options de unpack pour ca la je cherchais des champs specifiques */
$i++;
}
Marsh Posté le 01-02-2002 à 22:31:31
voici un example du perlfaq5 de perl.
Comment manipuler un fichier avec des enregistrements de longueur fixe?
Le plus efficace est d'utiliser pack() et unpack(). C'est plus rapide que d'utiliser substr() sur de nombreuses, nombreuses
chaînes. C'est plus lent pour seulement quelques unes.
Voici un morceau de code démontrant comment décompiler et recompiler ensuite des lignes formattées selon un schéma donné, ici
la sortie du programme ps, version Berkeley:
# exemple de ligne:
# 15158 p5 T 0:00 perl /home/ram/bin/scripts/now-what
$PS_T = 'A6 A4 A7 A5 A*';
open(PS, "ps|" );
print scalar <PS>;
while (<PS> ) {
($pid, $tt, $stat, $time, $command) = unpack($PS_T, $_);
for $var (qw!pid tt stat time command!) {
print "$var: <$$var>\n";
}
print 'line=', pack($PS_T, $pid, $tt, $stat, $time, $command),
"\n";
}
Nous avons utilisé $$var d'une façon défendue par use strict 'refs'. En effet, nous promouvons une chaîne au statut de
référence sur une variable scalaire par le biais d'une référence symbolique. C'est justifié dans des petits programmes, mais
supporte mal l'utilisation intensive. D'autre part, cela ne fonctionne qu'avec des variables globales, par opposition aux
lexicales.
Marsh Posté le 01-02-2002 à 17:00:27
Je voudrais lire dans le fichier /var/adm/wtmp les structures concernant les derniers login... Comment faire ?
Comment lit-on une structure ?
merci d'avance