Vous transmettez l'intégralité du tableau @Args
en CORE::close
, qui n'est pas un descripteur de fichier. Vous devez passer dans l'élément correct du tableau. Voici un exemple qui prend un nom de fichier à partir de la ligne de commande, et fait la bonne chose:
use warnings;
use strict;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "\n";
# the next line is where the issue is
CORE::close($Args[0]);
};
}
die "need file param" if ! @ARGV;
my $file = $ARGV[0];
open my $fh, $file or die $!;
close $fh or die $!;
Je vais aller plus loin avec ce que vous avez. Tout d'abord, je vais redéfinir les choses pour que le remplacement de la fonction CORE
se fasse dans le fichier .pm
au lieu du fichier de test, ensuite je vais passer à l'utilisation des descripteurs de fichiers lexicaux, car les noms globaux de bareword ne fonctionneront pas ici:
Test.pm
:
package Test;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "\n";
CORE::close($Args[0]);
};
}
1;
fichier script:
use warnings;
use strict;
use lib '.';
use Test;
open my $fh, 'test.pl' or die $!;
close $fh or die $!;
Entre le code migration et à l'aide des descripteurs de fichiers lexicales, les choses devraient fonctionner comme on peut s'y attendre.
sortie de l'exécution du script:
3
... et assurer que tout est en ordre, je vais revenir à la configuration par défaut, où le remplacement est dans le script de test, pas le module :
Test.pm
package Test;
open my $fh, 'test.pl' or die $!;
close $fh or die $!;
1;
... et le script:
use warnings;
use strict;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "\n";
CORE::close($Args[0]);
};
}
use lib '.';
use Test;
sortie:
4
utilisation Manquant 'strict' (et' utilisation warnings' dans Test.pm). N'appelez pas votre propre module 'Test.pm'; il y a déjà un module 'Test' standard. 'close (@Args)' est incorrect car 'close' impose un contexte scalaire sur ses arguments. – melpomene
Voir aussi ['perldoc perlsub'] (http://perldoc.perl.org/perlsub.html#Prototypes) et rechercher' qualified_to_ref'. – melpomene
@melpomene Si 'close (@Args)' est incorrect, alors qu'est-ce qui est juste? – porton