在Perl中,如何将结果STDOUT打印到同一目录中的临时空白新文件中?
我是Perl新手,所以这可能是一个我仍然无法理解的非常基本的情况 案例:在Perl中,如何将结果STDOUT打印到同一目录中的临时空白新文件中?,perl,stdout,stdin,temporary-files,Perl,Stdout,Stdin,Temporary Files,我是Perl新手,所以这可能是一个我仍然无法理解的非常基本的情况 案例: 程序告诉用户键入文件名。 用户键入文件名(1个或多个文件)。 程序读取文件输入的内容。 如果是单文件输入,则只打印其全部内容。 如果是多文件输入,则会按顺序组合每个文件的内容。 然后将结果打印到临时新文件中,该文件与program.pl位于同一目录中 file1.txt: 头部 a b 结束 file2.txt: 头部 c d e f 结束 单输入程序ioSingle.pl: #!/usr/bin/perl print
程序告诉用户键入文件名。
用户键入文件名(1个或多个文件)。
程序读取文件输入的内容。
如果是单文件输入,则只打印其全部内容。
如果是多文件输入,则会按顺序组合每个文件的内容。
然后将结果打印到临时新文件中,该文件与program.pl位于同一目录中 file1.txt:
头部
a
b
结束 file2.txt:
头部
c
d
e
f
结束 单输入程序ioSingle.pl:
#!/usr/bin/perl
print "File name: ";
$userinput = <STDIN>; chomp ($userinput);
#read content from input file
open ("FILEINPUT", $userinput) or die ("can't open file");
#PRINT CONTENT selama ada di file tsb
while (<FILEINPUT>) {
print ; }
close FILEINPUT;
我很难让它适用于多文件输入,我应该如何重新格式化代码,以便我的程序可以给出这样的结果 预期多文件会导致cmd:
perl ioMulti.pl文件名:file1.txt file2.txt 头部
a
b
结束
头部
c
d
e
f
结束
感谢您的回复:)简单的方法是使用菱形操作符
打开并读取命令行上指定的文件。这将实现您的目标:
while (<>) {
chomp;
print "$_\n";
}
这些开关围绕-e
命令创建隐式循环。-p
开关在每个循环后打印$\uu
,就像您编写了:
LINE:
while (<>) {
# your code...
} continue {
print;
}
因此,
-p
添加了一个隐式打印语句。简单的方法是使用菱形操作符
打开并读取命令行上指定的文件。这将实现您的目标:
while (<>) {
chomp;
print "$_\n";
}
这些开关围绕-e
命令创建隐式循环。-p
开关在每个循环后打印$\uu
,就像您编写了:
LINE:
while (<>) {
# your code...
} continue {
print;
}
因此,
-p
添加了一个隐式打印语句。开始处理此类问题的一个好方法是将其分解为更小的部分
您的问题似乎可以归结为:
- 获取文件名列表
- 对于列表中的每个文件
- 显示文件内容
sub display_file_contents {
# filename is the first (and only argument) to the sub
my $filename = shift;
# Use lexical filehandl and three-arg open
open my $filehandle, '<', $filename or die $!;
# Shorter version of your code
print while <$filehandle>;
}
通过将任务分解为更小的任务,每个任务都变得更容易处理。你不需要一次就把整个程序的复杂性放在脑子里
p、 但正如JRFguson所说,将文件列表作为命令行参数将使这一过程简单得多。解决此类问题的一个好方法是将其分解为更小的部分 您的问题似乎可以归结为:
- 获取文件名列表
- 对于列表中的每个文件
- 显示文件内容
sub display_file_contents {
# filename is the first (and only argument) to the sub
my $filename = shift;
# Use lexical filehandl and three-arg open
open my $filehandle, '<', $filename or die $!;
# Shorter version of your code
print while <$filehandle>;
}
通过将任务分解为更小的任务,每个任务都变得更容易处理。你不需要一次就把整个程序的复杂性放在脑子里
p、 但正如JRFguson所说,将文件列表作为命令行参数将使这一过程简单得多。感谢您的响应,是的,代码如下:
while($userinput=){print($userinput);}
当通过perl program.pl file1.txt file2.txt执行时,tht将简单地给出多文件输入的组合内容@Dave Cross首先演示了如何从提示文本中读取输入感谢您的响应,是的,类似这样的代码:while($userinput=){print($userinput);}
当由>perl program.pl file1.txt file2.txt执行时,tht将简单地给出一个多文件输入的组合内容@Dave Cross首先演示了如何从提示文本中读取输入,我已经通过上面的代码对其进行了管理。起初它在打印时给了我错误警告。我现在已经修好了。但重要的是不要只是剪切粘贴我的解决方案。但是为了理解我草拟的设计过程,以便将来可以遵循类似的过程,我已经通过上面的代码进行了管理。起初它在打印时给了我错误警告。我现在已经修好了。但重要的是不要只是剪切粘贴我的解决方案。但是为了理解我所勾勒出的设计过程,以便将来可以遵循类似的过程。
sub get_list_of_files {
print 'File name(s): ';
my $files = <STDIN>;
chomp $files;
# We might have more than one filename. Need to split input.
# Assume filenames are separated by whitespace
# (Might need to revisit that assumption - filenames can contain spaces!)
my @filenames = split /\s+/, $files;
return @filenames;
}
#!/usr/bin/perl
use strict;
use warnings;
my @list_of_files = get_list_of_files();
foreach my $file (@list_of_files) {
display_file_contents($file);
}