2016-03-13 5 views
0

Мне нужно, чтобы дешифрование было в ROT-25, которое, я думаю, я уже настроил. Затем необходимо дешифровать файл, считываемый из командной строки, и это моя проблема. Я предполагаю, что это должно быть запущено, как perl filename anyfile.txt, но как мне настроить это?Расшифровка файла, считанного из командной строки

#!/Strawberry/perl/bin/perl 
use v5.14; 
my ($file1) = @ARGV; 
open my $fh1, '<', $file1; 
while (<$fh1>) { 

sub encode_decode { 
    shift =~ tr/A-Za-z/Z-ZA-Yz-za-y/r; 
} 

my $enc = encode_decode(); 
my $dec = encode_decode($enc); 
say "Enc: ", $enc; 
say "Dec: ", $dec; 

} 
close $fh1; 
+1

Не устанавливайте сабвуфер в цикле в то время как , – toolic

+1

хорошо, спасибо perl – CorDell

+0

@toolic Чтобы быть конкретным, на самом деле это не имеет значения, где вы его положили. Но это, вероятно, не очень хорошая практика. – TLP

ответ

1

Здесь есть несколько вопросов. Во-первых, функция, использующая ту же логику для encode_decode(), не имеет смысла для ROT25, только для ROT13. Для того, чтобы создать свой первоначальный кодированный файл, вы можете использовать Unix, чтобы сделать это:

echo "The secret of getting ahead is getting started -- Mark Twain" | tr "A-Za-z" "Z-ZA-Yz-za-y" > encoded_twain.txt 

затем запустить программу на encoded_twain.txt

Так как вам нужно, чтобы определить, если «» появляется anywere в тексте, чтение файл в строке за строкой не лучший выбор. Вам лучше читать его как одну строку, а затем и расшифровку, и тестирование.

Ваш декодер должен делать противоположное тому, что он делает сейчас (кодирование).

Собираем все вместе, мы получаем что-то вроде:

use English; 

my $file_name = shift; 

sub decode 
{ 
    return shift =~ tr/Z-ZA-Yz-za-y/A-Za-z/r; 
} 

open my $file_handle, '<', $file_name; 

my $encoded = ''; 

{ # allow us to read entire file in as a string: 

    local $INPUT_RECORD_SEPARATOR = undef; 

    $encoded = <$file_handle>; 
} 

close $file_handle; 

my $decoded = &decode($encoded); 

if ($decoded =~ m/(^|)the /m) # make this more robust! 
{ 
    print($decoded); 
} 
+0

@CorDell, я поменял '/ i' на совпадение шаблона для'/m', что сделает регистр теста шаблона чувствительным, как вы отметили в более раннем комментарии, и позволит ему пересекать другие строки в тексте , как вы также отметили. – cdlane

0

только небольшое изменение, либо объявить переменную для хранения текущей строки (или используйте $_):

open my $fh1, '<', $file1; 
while (my $line = <$fh1>) { 
    my $dec = decode($line); 
# say "Dec: ", $dec; 
} 
close $fh1; 

Вы можете проверить декодированные линии за «». Если он найден, снова откройте файл и распечатайте все строки.

Смежные вопросы