我的文件没有在 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();
(或提供默认值)
-
use open ':std', ':encoding(UTF-8)';
现在所有流都将是 encoded/decoded,因此您不必为每个 open
都这样做。这可以根据需要覆盖。
我正在编写一个程序,该程序应该从放在命令行的另一个文件中获取数据,运行对其进行加密,然后将其输出的数据复制到另一个文件,但它不是'正确保存数据。
#!/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();
(或提供默认值)-
use open ':std', ':encoding(UTF-8)';
现在所有流都将是 encoded/decoded,因此您不必为每个
open
都这样做。这可以根据需要覆盖。