Evitar que las cadenas se interpreten como un identificador de archivo

Perl tiene la característica de que las cadenas nombradas como un identificador de archivo se llevan aser un filehandle:

# let this be some nice class I wrote
package Input {
    sub awesome { ... }
}

Entonces cuando lo hacemosInput->awesome o extra-cuidado:'Input'->awesome, se llamará al método. A no ser que:

# now somewhere far, far away, in package main, somebody does this:
open Input, "<&", \*STDIN or die $!;  # normally we'd open to a file

Este código ni siquiera tiene que ejecutarse, solo debe ser visto por el analizador para que Perl interprete la cadena'Input' como un identificador de archivo de ahora en adelante. Por lo tanto, una llamada al método'Input'->awesome morirá porque el objeto que representa el identificador de archivo no tiene métodos increíbles.

Como solo tengo el control de mi clase pero no de otro código, no puedo simplemente decidir usar solo manejadores de archivos léxicos en todas partes.

¿Hay alguna forma en que pueda forzarInput->awesome para ser siempre un método de llamada en elInput paquete, pero nunca un identificador de archivo (al menos en ámbitos controlados por mí)? Creo que no debería haber ningún choque de nombres porque elInput el paquete es en realidad el%Input:: reserva.

Código completo para reproducir el problema (ver también estoideona):

use strict;
use warnings;
use feature 'say';

say "This is perl $^V";

package Input {
    sub awesome {
        say "yay, this works";
    }
}

# this works
'Input'->awesome;

# the "open" is parsed, but not actually executed
eval <<'END';
    sub red_herring {
        open Input, "<&", \*STDIN or die $!;
    }
END
say "eval failed: $@" if $@;

# this will die
eval {
    'Input'->awesome;
};
say "Caught: $@" if $@;

Salida de ejemplo:

This is perl v5.16.2
yay, this works
Caught: Can't locate object method "awesome" via package "IO::File" at prog.pl line 27.

Respuestas a la pregunta(2)

Su respuesta a la pregunta