@INC ловит неизвестную фатальную ошибку - PullRequest
3 голосов
/ 10 октября 2011

Эй, я пишу программу, которая использует ловушку @INC для расшифровки реального источника perl из blowfish.У меня довольно раздражающая проблема, которая не проявляется в использовании предупреждений или каких-либо моих стандартных приемов ... По сути, когда я начинаю создавать новый объект шифрования, цикл переходит к следующему объекту в @INC без ошибки или чего-либо еще.... Я не знаю, что делать!

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;
use File::Spec;

sub load_crypt {
    my ($self, $filename) = @_;
    print "Key?\n: ";
    chomp(my $key = <STDIN>);
    for my $prefix (@INC) {
            my $buffer = undef;
            my $cipher = Crypt::CBC->new( -key => $key, -cipher => 'Blowfish');
            my $derp = undef;
            $cipher ->start('decrypting');
            open my $fh, '<', File::Spec->($prefix, "$filename.nc") or next;
            while (read($fh,$buffer,1024)) {
                    $derp .= $cipher->crypt($buffer);
            }
            $derp .= $cipher->finish;
            return ($fh, $derp);
    }
}

BEGIN {
    unshift @INC, \&load_crypt;
}
require 'gold.pl';

Также, если я добавлю фактический ключ в метод инициализации, он все равно не будет работать

1 Ответ

4 голосов
/ 10 октября 2011

У вас здесь куча проблем.Прежде всего, вы используете File :: Spec неправильно.Во-вторых, вы возвращаете дескриптор файла, который уже находится в конце файла, и строку, которая не является допустимым возвращаемым значением.(Кроме того, я бы поставил подсказку о ключе за пределами крючка.)

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;
use File::Spec;

# Only read the key once:
print "Key?\n: ";
chomp(my $key = <STDIN>);

sub load_crypt {
  my ($self, $filename) = @_;
  return unless $filename =~ /\.pl$/;
  for my $prefix (@INC) {
    next if ref $prefix;
    #no autodie 'open'; # VERY IMPORTANT if you use autodie!
    open(my $fh, '<:raw', File::Spec->catfile($prefix, "$filename.nc"))
        or next;
    my $buffer;
    my $cipher = Crypt::CBC->new( -key => $key, -cipher => 'Blowfish');
    my $derp;
    $cipher->start('decrypting');
    while (read($fh,$buffer,1024)) {
      $derp .= $cipher->crypt($buffer);
    }
    $derp .= $cipher->finish;
    # Subroutine writes 1 line of code into $_ and returns 1 (false at EOF):
    return sub { $derp =~ /\G(.*\n?)/g and ($_ = $1, 1) };
  }
  return; # Didn't find the file; try next @INC entry
} # end load_crypt

# This doesn't need a BEGIN block, because we're only using the hook
# with require, and that's a runtime operation:
unshift @INC, \&load_crypt;
require 'gold.pl';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...