我在perl脚本中有这一行,它将输出打印到STDOUT / console
printf "Line no. $i"
我应该在程序中包含哪些代码来将此输出定向到用户在命令行本身给出的输出文件(如下所述)
现在,以下部分要求用户输入文件:
print "enter file name";
chomp(my $file=<STDIN>);
open(DATA,$file) or die "error reading";
但我不想让用户询问输入/输出文件。 我想要的是一种方式,用户可以在运行程序时从命令行输入输入和输出文件。
perl input_file output_file program.pl
我应该包含哪些代码。
答案 0 :(得分:1)
您可以使用shift
来读取脚本的命令行参数。 shift
读取并删除数组的第一个元素。如果没有指定数组(并且不在子例程中),它将隐式读取@ARGV
,其中包含传递给脚本的参数列表。例如:
use strict;
use warnings;
use autodie;
# check that two arguments have been passed
die "usage: $0 input output\n" unless @ARGV == 2;
my $infile = shift;
my $outfile = shift;
# good idea to sanitise the arguments here
open my $in, "<", $infile;
open my $out, ">", $outfile;
while (<$in>) {
print $out $_;
}
close $in;
close $out;
您可以将此脚本称为perl script.pl input_file output_file
,并将input_file
的内容复制到output_file
。
答案 1 :(得分:1)
这里最简单的方法是忽略程序中的输入和输出文件。只需从STDIN读取并写入STDOUT即可。让用户在调用程序时重定向这些文件句柄。
你的程序看起来像这样:
#!/usr/bin/perl
use strict;
use warnings;
while (<STDIN>) {
# do something useful to the data in $_
print;
}
你这样称呼它:
$ ./your_program.pl inputfile.txt > outputfile.txt
这被称为&#34; Unix过滤器模型&#34;它是编写读取输入和产生输出的程序的最灵活方式。
答案 2 :(得分:0)
您可以使用@ARGV变量,
use strict ;
use warnings ;
if ( @ARGV != 2 )
{
print "Usage : <program.pl> <input> <output>\n" ;
exit ;
}
open my $Input,$ARGV[0] or die "error:$!\n" ;
open my $Output,">>" .$ARGV[1] or die "error:$!\n";
print $Output $_ while (<$Input> ) ;
close ($Input) ;
close ($Output) ;
注意:的
您应该以此格式运行程序perl program.pl input_file output_file
。