2010-11-01 8 views
3

Je voudrais obtenir le nom de fichier et le numéro de ligne actuels dans un script Perl. Comment puis-je faire cela?Comment obtenir le nom de fichier et le numéro de ligne en Perl?

Par exemple, dans un appel de fichier test.pl:

my $foo = 'bar'; 
print 'Hello World'; 
print functionForFilename() . ':' . functionForLineNo(); 

Il génèrerait:

Hello World 
test.pl:3 

Répondre

12

Ils sont disponibles avec les __LINE__ et __FILE__ jetons, comme indiqué dans perldoc perldata sous "littéraux spéciales" :

Le spécial l Les itérations __FILE__, __LINE__ et __PACKAGE__ représentent le nom de fichier, le numéro de ligne et le nom du paquet courant à ce point de votre programme. Ils peuvent être utilisés uniquement comme des jetons séparés; ils ne seront pas interpolés en chaînes. S'il n'y a pas de paquet courant (en raison d'une directive package vide), __PACKAGE__ est la valeur indéfinie.

+0

À condition qu'ils n'aient pas été tracés. – tchrist

+0

@tchrist: oui, le filtrage de la source vis beaucoup de choses :) – Ether

+1

Pas seulement ceux-ci. Vous pouvez également modifier les valeurs '__FILE__' et' __LINE__' en utilisant les directives '# line', puis quelques bogues perl qui font que' __LINE__' est légèrement différent dans certains cas. – rafl

6

Vous pouvez utiliser:

print __FILE__. " " . __LINE__; 
7

La fonction caller fera ce que vous cherchez:

sub print_info { 
    my ($package, $filename, $line) = caller; 
    ... 
} 

print_info(); # prints info about this line 

Cela obtenir les informations d'où le sous est appelé, ce qui est probablement Qu'est-ce que tu cherches. Les directives __FILE__ et __LINE__ s'appliquent uniquement à l'endroit où elles sont écrites, vous ne pouvez donc pas encapsuler leur effet dans un sous-programme. (sauf si vous vouliez un sous qui imprime seulement des informations sur l'endroit où il est défini)

Questions connexes