2010-08-29 15 views
12

Così ho un file che in breve ha questo problema ...Come gestire subroutine ridefinito gli errori in Perl

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

use strict; 
use POSIX; 

... 

sub remove { 
    ... 
} 
... 

e ottengo un un errore che dice la subroutine remove è stato ridefinito. Conosco il problema, c'è una subroutine chiamata remove in POSIX. Tuttavia, non so come gestirlo. In che modo questo problema viene risolto in genere?

risposta

19

fare questo:

use POSIX(); 

che si fermerà l'esportazione tutte le funzionalità di default del modulo POSIX. Sarà quindi necessario anteporre tutti i metodi POSIX con POSIX :: quali:

POSIX::remove(filename) 

per la funzione POSIX rimozione.

+0

Grazie. È convenzionale? – floogads

+1

Sì, in generale per evitare definizioni di subroutine in conflitto è meglio non importare nulla o solo quelle subroutine di cui si è certi avranno nomi univoci. – ennuikiller

+5

@floogads, è più normale dire "usa POSIX qw (mkfifo modf);" dove si elencano esplicitamente tutte le funzioni che si desidera importare. In questo modo, non devi usare dappertutto il prefisso 'POSIX ::' e non devi preoccuparti dei conflitti con i nomi delle subroutine nel tuo programma. – cjm

22

L'altro modo per sopprimere questo avvertimento è quello di mettere il vostro ridefinizione subroutine all'interno di un no warnings 'redefine' blocco: '! Nome'

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

È possibile escludere certi simboli vengano normalmente esportata con la direttiva (v perldoc Exporter), es .:

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

use strict; 
use POSIX '!remove'; 

... 

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

Non conoscevo la direttiva "! Name"! Neat! –

Problemi correlati