在Perl中,如何将结果STDOUT打印到同一目录中的临时空白新文件中?

在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

我是Perl新手,所以这可能是一个我仍然无法理解的非常基本的情况

案例:
程序告诉用户键入文件名。
用户键入文件名(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);
}