• Publicidad

Existencia de archivo y su propietario en Linux

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Re: Existencia de archivo y su propietario en Linux

Notapor wanako » 2011-01-21 22:36 @983

explorer escribiste:A ver... no puede ser "molesto" si viene incluido en la distribución base de Perl. ;)

Bueno, si molesto es un adjetivo poco feliz la discusión puede ser eterna, podemos decir ¿no retrocompatible? ;)
explorer escribiste:Este módulo sobreescribe o secuestra la función del sistema stat(), para dar la posibilidad de acceder a los datos devueltos por el stat() normal, pero de una forma más cómoda, ergo deducen que quien pone un use File::stat; en su programa es porque no quiere acceder a la funcionalidad de la stat() integrada.

Claro, pero File::stat está integrado, es a mi entender algo como elegir entre say() y print() 'capado', salvando las distancias.
explorer escribiste:Lo de los problemas de versiones: hasta antes de Perl v5.12, teníamos que seguir haciendo lo que hemos hecho siempre, para comprobar si un fichero era legible, ejecutable o texto plano, era seguir usando los operadores -X. Pero a partir de Perl v5.12, eso ya se puede hacer con el propio objeto que devuelve File::stat. Así, un programa que hiciera
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fichero    = '/etc/crontab';
my($uid,$size) = (stat($fichero))[4,7];
my $es_legible = -r $fichero;
my $es_texto   = -f $fichero;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

ahora se puede reescribir así
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use File::stat;
my $fichero    = '/etc/crontab';
my $st_fichero = stat($fichero);
my $uid        = $st_fichero->uid;
my $size       = $st_fichero->size;
my $es_legible = -r $st_fichero;
my $es_texto   = -f $st_fichero;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con lo que queda un poquito más claro (en lugar de un 4 y un 7, tenemos 'uid' y 'size', más gráficas).

Se podrían seguir usando las opciones -X sobre $fichero, desde luego, pero File::stat da una posibilidad más. No quita posibilidades.

El problema ha venido porque yo he realizado el programa en mi Perl v5.12, sin darme cuenta de que, efectivamente, los operadores -X solo funcionan en esa versión con los objetos File::stat. Así que, una de dos: o pongo un use 5.012; al principio de mi programa o, mucho mejor, adoptamos tu solución de cambiar $estatus por $archivo. ;)


Mi apreciación del caso no fue para buscar una solución alternativa, sin querer me topé con lo que yo llamaría incongruencia e ilegibilidad del código.

La opción uno use 5.012; no funciona en 5.10 como si fuera use features;.

En 5.12 no se puede sobreescribir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use File::stat;
  4. my $fichero    = '/etc/crontab';
  5. my $st_fichero = stat($fichero);
  6.  
  7. eval { my $no_es_binario = ! -B $st_fichero; };
  8. warn $@ if $@;
  9. if (-r $fichero && (my($uid,$size) = (stat(_))[4,7])) {
  10.     print "Uid: $uid Size: $size\n";
  11. }
  12. print "Es molestillo\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Efectivamente, sí quita posibilidades y no provee de otras para su reemplazo en formato de POO, obligándome a usar la forma ¿antigua? en ciertos casos, comenta el use File::stat; y el if se cumple, déjalo y comenta el if para que el warn se cumpla.

Lo sé, no es muy usada la sintaxis, pero...
...es molesto :D
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Publicidad

Re: Existencia de archivo y su propietario en Linux

Notapor explorer » 2011-01-22 10:21 @473

Si comentaba lo del use 5.012, era para indicar que necesitabas mínimo esa versión para que mi solución funcionara :)

En cuanto al ejemplo que pones, insisto en que si pones File::stat, es porque no quieres usar el stat() integrado. De todas formas, sí que puedes usar el stat() integrado, escribiéndolo como CORE::stat().

En la sección BUGS de la documentación del módulo, se comenta que la variable $_ y el manejador especial '_' ya no son válidos con las funciones stat() y lstat() de File::stat, pero sí que hay formas de pasarlas al módulo, bien sea explicitando a la variable $_, como llamando a File::stat::populate() con el manejador '_'.

Estoy de acuerdo contigo en que lo que resulta molesto es en la no completa compatibilidad con lo que anuncia el módulo. En tu ejemplo pones la prueba '-B', y en mi File::stat dice que esa opción no está (todavía) implementada, lo cual me obligaría a pasar de -B $st_fichero a -B $fichero. Vamos, que seguiremos usando los test de fichero como hemos hecho siempre, y esperaremos, en un futuro próximo, a que terminen de integrarse en el módulo (o quizás, eso nunca suceda).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Administración

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados