• Publicidad

Problema con mkdir

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con mkdir

Notapor scr » 2009-04-30 14:54 @662

Buenas. Es la primera vez que escribo en este post, y me gustaría consultar una duda que tengo.

El problema es que quiero usar mkdir(), pero la dirección nueva se encuentra en varias variables.

Me explico: yo tengo un directorio que es, por ejemplo, ./home/pepe, y quiero crear uno nuevo de la siguiente forma ./home/p/pepe/. El nuevo directorio contiene un nivel más, con la primera letra de la carpeta pepe. Así, si tuviéramos ./home/hola, el nuevo directorio sería ./home/h/hola.

Entonces, por una parte, tengo una variable constante que contiene ./home. Otra variable con la letra inicial de la correspondiente carpeta (p.e., /p) y otra variable con el resto de la ruta (p.e., /pepe).

El problema viene a la hora de hacer el mkdir(). Yo pongo mkdir($var1,$var2,$var3,0777), pero me lanza un error de demasiados argumentos. Entonces he estado buscando pero no encuentro la forma de hacerlo correctamente. Porque también he intentado unirlo todo en un vector pero no funciona (creo que devuelve el número de campos). También he intentado unirlo todo en una variable de la forma $nueva_var = "$var1$var2$var3";

Ojalá alguien me pueda ayudar o dar alguna idea. Muchas gracias y perdonad si he puesto algo mal, pero ando muy verde.

¡Un saludo!
scr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-04-30 14:39 @652

Publicidad

Notapor explorer » 2009-04-30 15:01 @667

Bienvenido a los foros de Perl en Español, scr.

Prueba con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
mkdir("$var1$var2$var3");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Usamos la interpolación de las dobles comillas para que las una.

Como, además, por defecto, mkdir() pone permisos según una máscara 0777, pues entonces no hace falta que la pongas.

Otra forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
mkdir($var1 . $var2 . $var3);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El operador '.' realiza la concatenación de cadenas de caracteres.

Lo que me extraña es que te falle la segunda solución, la de unirla antes en una variable aparte.

Sería interesante ver el código que falla, al menos esas líneas.
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

Notapor scr » 2009-05-01 10:26 @476

Hola, muchas gracias por contestar tan rápido.

He solucionado en parte el problema. En principio ya tengo la nueva dirección que quiero. Lo he hecho de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@nueva_dir = ($var1,$var2,'/',$var3);
$nueva_dir = join(' ',@nueva_dir);
mkdir($nueva_dir) or die...;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero creo que ahora el error está en el fichero que abro (passwd), porque me lanza este error:

Código: Seleccionar todo
   No existe el fichero o directorio at (...) linea 415, <PASSWD> (este es el manejador que he usado para abrir el fichero) linea 6


Entonces supongo que antes de crear el directorio, necesito cambiar el directorio de casa del usuario de la línea 6 y después hacer el mkdir(), pero no sé cómo cambiar el contenido del fichero passwd (creo que esto lo respondiste en otro post, voy a buscar).

Muchas gracias.
scr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-04-30 14:39 @652

Notapor explorer » 2009-05-01 11:22 @515

Esas 3 líneas indican que a $var2 le faltaba el'/' final, por lo que no responde a la definición que dabas en el primer mensaje.

Debes estar seguro de qué contienen todos los componentes, para luego saber cómo debes unirlos.

Por ejemplo, yo adopto la estrategia de que ningún nombre de directorio debe contener el separador de ficheros, porque lo pondré más tarde, y así, hacerlo más visual:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $DIR_HOME = 'home';
my $DIR_USER = 'pepe';

my $DIR_CHAR = substr $DIR_USER, 0, 1;

my $DIR_NEW  = "/$DIR_HOME/$DIR_CHAR/$DIR_USER";

mkdir $DIR_NEW or die "ERROR: No pude crear [$DIR_NEW]: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Observa que en caso de fallo imprimo el valor de la variable, encerrada entre corchetes, para saber exactamente qué es lo que le he pasado a mkdir().
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

Notapor scr » 2009-05-01 12:42 @571

Hola, haciendo lo último que me dijiste me ha funcionado la primera vez al intentarlo.

Después he borrado las carpetas que se crearon manualmente, y al intentarlo otra vez, me ha vuelto a salir el mismo error.

Me he asegurado de que el fichero passwd contuviese los mismos datos, y así es, no ha cambiado nada. De todas formas lo reemplacé por el original, por si acaso, pero nada, me sigue saliendo el mismo fallo. Y no lo entiendo, porque según dice, no existe la ruta ../home/pepe, cuando en realidad sí existe. Algo le debo estar pasando mal.
Un saludo.
scr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-04-30 14:39 @652

Notapor explorer » 2009-05-01 12:50 @576

Fíjate que ../home/pepe es un camino relativo, así que depende de en dónde se esté haciendo esa pregunta, puede resultar la respuesta verdadera o falsa.

¿No estarás haciendo chdir() dentro del programa de forma descontrolada?

Usa el módulo Cwd si necesitas saber dónde estás.
Última edición por explorer el 2009-05-01 12:57 @581, editado 1 vez en total
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor scr » 2009-05-05 04:52 @244

Hola, al final lo solucioné con mkpath().
Muchas gracias.
scr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-04-30 14:39 @652


Volver a Básico

¿Quién está conectado?

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

cron