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

时间:2018-04-28 01:28:42

标签: perl copy file-handling

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

#!/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 :(得分:3)

如果您想逐行从输入“转换”到输出,则需要在循环中执行此操作

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);
}

我不是在暗示,只是注意到它。一个名字很好的变量有 nothing 错误。

关于代码的一些注释

  • 无需声明(my $userinput;)并单独指定($userinput = ...

  • 无需对"$ARGV[0]"之类的变量进行双引号(这可能会导致细微的麻烦)

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

  • 请注意open pragma

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

    现在所有流都将被编码/解码,因此您不必为每个open执行此操作。这可以根据需要覆盖。