2010-08-29 12 views
12

Así que tengo un archivo que en definitiva tiene este problema ...Cómo manejar subrutina redefinido errores en Perl

#!/usr/bin/perl -w 
package Foo; 

use strict; 
use POSIX; 

... 

sub remove { 
    ... 
} 
... 

y me da una obtiene un error diciendo la subrutina remove se ha redefinido. Sé el problema, hay una subrutina llamada remove en POSIX. Sin embargo, no sé cómo manejarlo. ¿Cómo se resuelve este problema típicamente?

Respuesta

19

hacer esto:

use POSIX(); 

que se detendrá la exportación toda la funcionalidad por defecto del módulo POSIX. A continuación, tendrá como prefijo para todos los métodos de POSIX con POSIX :: tales como:

POSIX::remove(filename) 

para la función de eliminación de POSIX.

+0

Gracias. Es esto convencional? – floogads

+1

Sí, en general, para evitar definiciones conflictivas de subrutinas es mejor no importar nada o solo aquellas subrutinas de las que está seguro que tendrán nombres únicos. – ennuikiller

+5

@floogads, es más habitual decir 'use POSIX qw (mkfifo modf);' donde enumera explícitamente todas las funciones que desea importar. De esta forma, no tiene que usar el prefijo 'POSIX ::' por todas partes, y no tiene que preocuparse por los conflictos con los nombres de subrutinas en su programa. – cjm

22

La otra manera de suprimir esta advertencia es para poner su redefinición subrutina dentro de un bloque no warnings 'redefine':

{ 
    no warnings 'redefine'; 
    sub remove { ... } 
} 
18

Puede excluir ciertos símbolos de ser comercializadas habitualmente con la directiva '! Nombre' (ver perldoc Exporter), por ejemplo:

#!/usr/bin/perl -w 
package Foo; 

use strict; 
use POSIX '!remove'; 

... 

sub remove { 
    ... 
} 
... 
+1

¡No sabía sobre la directiva '! Name'! ¡Ordenado! –

Cuestiones relacionadas