我的文件没有在 perl 中正确复制

My file isnt copying properly in perl

我正在编写一个程序,该程序应该从放在命令行的另一个文件中获取数据,运行对其进行加密,然后将其输出的数据复制到另一个文件,但它不是'正确保存数据。

#!/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 ) - 65 + $key) % 26) + 65)/geir;
 }
 my $user = decodecaesar($userinput, 1);
 print "$user";

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

它正在将某些内容复制到文件中,因为每当我将某些内容放入文件时,它就会被空文件覆盖,而其读取的文件不为空并且可以正常工作。我哪里搞砸了?

如果你的意思是"translate"逐行从输入到输出,你需要在循环中进行

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

请注意,使用 $line 是命名从文件中获取一行的变量的常见且良好的约定。我从 OP 中留下 $userinput 以防它是为了传达文件包含某种特定意义上的用户输入。不过,我建议重新考虑。

在这种情况下,您还可以使用 default input and pattern-searching space, $_

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

我不是在暗示这一点,只是注意到这一点。 没有任何问题 一个很好命名的变量。


关于代码的几点说明

  • 无需声明(my $userinput;),单独赋值($userinput = ...)

  • 不需要像"$ARGV[0]"这样的变量双引号(这可能会导致微妙的麻烦)

  • 始终检查输入,my $input = $ARGV[0] || usage();(或提供默认值)

  • 注意open pragma

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

    现在所有流都将是 encoded/decoded,因此您不必为每个 open 都这样做。这可以根据需要覆盖。