Мой файл не копируется должным образом в Perl - PullRequest
0 голосов
/ 28 апреля 2018

Я пишу программу, которая должна получать данные из другого файла, помещенного в командную строку, запускать шифр и копировать те данные, которые выводятся в другой файл, но при этом данные не сохраняются должным образом. ,

#!/usr/bin/perl
use strict;
use warnings;
my $userinput;
my $filename = "$ARGV[0]";
open(my $fh, '<:encoding(UTF-8)', $filename) or die "Couldn't open '$filename' $!";
open(my $oh, '>:encoding(UTF-8)', "$filename.dec") or die "Couldn't save '$filename' $!";
$userinput= <$fh>;
sub decodecaesar {
    my ($message, $key) = @_;
    $key = 26 - $key;
    $message =~ s/([A-Z])/chr(((ord(uc $1) - 65 + $key) % 26) + 65)/geir;
 }
 my $user = decodecaesar($userinput, 1);
 print "$user";

 while(<$fh>){
    print $oh $user;
 }
 close($fh);
 close($oh);

Он копирует что-то в файл, так как всякий раз, когда я помещаю что-то в файл, он перезаписывается пустым файлом, в то время как файл, из которого он читает, не пустой и работает должным образом. Где я облажался?

1 Ответ

0 голосов
/ 28 апреля 2018

Если вы хотите «переводить» входные и выходные строки построчно, вам нужно сделать это внутри цикла

while (my $userinput = <$fh>) {
    chomp $userinput;
    print $oh decodecaesar($userinput, 1);
}

Обратите внимание, что использование $line является распространенным и хорошим соглашением для именования переменной, которая берет строку из файла. Я оставил $userinput из OP на случай, если он должен передать, что файл содержит пользовательский ввод в каком-то конкретном смысле. Тем не менее, я рекомендую пересмотреть.

В этом случае вы также можете использовать пространство ввода и поиска по умолчанию , $_

while (<$fh>) {
    chomp;
    print $oh decodecaesar($_, 1);
}

Я не предлагаю это, просто отмечаю это. * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * *} .

Несколько замечаний по коду

  • Не нужно объявлять (my $userinput;) и назначать отдельно ($userinput = ...)

  • Нет необходимости заключать в кавычки переменную наподобие "$ARGV[0]" (и это может привести к незначительным неприятностям)

  • Всегда проверять ввод, my $input = $ARGV[0] || usage(); (или предоставлять по умолчанию)

  • Обратите внимание на открытую прагму

    use open ':std', ':encoding(UTF-8)';
    

    и теперь все потоки будут кодироваться / декодироваться, поэтому вам не нужно делать это для каждого open. Это может быть отменено при необходимости.

...