Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如果命令行中给出了文件名,如何从文件中读取并将输出定向到文件,如果没有给出参数,如何打印到控制台_Perl_Redirect_Md5_Output - Fatal编程技术网

Perl 如果命令行中给出了文件名,如何从文件中读取并将输出定向到文件,如果没有给出参数,如何打印到控制台

Perl 如果命令行中给出了文件名,如何从文件中读取并将输出定向到文件,如果没有给出参数,如何打印到控制台,perl,redirect,md5,output,Perl,Redirect,Md5,Output,我创建了一个文件“rootfile”,其中包含指向特定文件的路径,perl程序mymd5.perl获取每个文件的md5sum并按特定顺序打印。如果命令行中给出了名称,如何将输出重定向到文件?例如,如果我这样做 perl mymd5.perl md5file 然后它将输出馈送到md5file。如果我这么做了 perl mydm5.perl 它只会打印到控制台 这是我的根文件: /usr/local/courses/cs3423/assign8/cmdscan.c /usr/local/cou

我创建了一个文件“rootfile”,其中包含指向特定文件的路径,perl程序mymd5.perl获取每个文件的md5sum并按特定顺序打印。如果命令行中给出了名称,如何将输出重定向到文件?例如,如果我这样做

perl mymd5.perl md5file
然后它将输出馈送到md5file。如果我这么做了

perl mydm5.perl 
它只会打印到控制台

这是我的根文件:

/usr/local/courses/cs3423/assign8/cmdscan.c
/usr/local/courses/cs3423/assign8/driver.c
/usr/local/courses/cs3423/assign1/xpostitplus-2.3-3.diff.gz
这是我现在的节目:

open($in, "rootfile") or die "Can't open rootfile: $!";
$flag = 0;

if ($ARGV[0]){
        open($out,$ARGV[0]) or die "Can't open $ARGV[0]: $!";
        $flag = 1;
}

if ($flag == 1) {
        select $out;
}

while ($line = <$in>) {
        $md5line = `md5sum $line`;
        @md5arr = split(" ",$md5line);
        if ($flag == 0) {
                printf("%s\t%s\n",$md5arr[1],$md5arr[0]);
        }
}
close($out);
open($in,“rootfile”)或die“无法打开rootfile:$!”;
$flag=0;
如果($ARGV[0]){
打开($out,$ARGV[0])或死亡“无法打开$ARGV[0]:$!”;
$flag=1;
}
如果($flag==1){
选择$out;
}
而($line=){
$md5line=`md5sum$line`;
@md5arr=拆分(“,$md5line);
如果($flag==0){
printf(“%s\t%s\n”、$md5arr[1]、$md5arr[0]);
}
}
收尾(美元);

您可以按如下方式打印受@ARGV中的值影响的文件名:

这将采用
$ARGV[0]
中的文件名,并使用它来命名新文件,
edit.$ARGV[0]

#!/usr/bin/perl
use warnings;
use strict; 

my $file = $ARGV[0];
open my $input, '<', $file or die $!;

my $editedfile = "edit.$file";
open my $name_change, '>', $editedfile or die $!;

if ($input eq "md5file"){    

while ($in){
    # Do something...
    print $name_change "$_\n";
}
#/usr/bin/perl
使用警告;
严格使用;
my$file=$ARGV[0];
打开我的$input、、$editedfile或die$!;
如果($input eq“md5file”){
while($in){
#做点什么。。。
打印$name\u更改“$\u\n”;
}

}如果您没有将文件句柄赋予打印打印,则输出将转到标准输出(控制台)

有几种方法可以重定向打印语句的输出

select $out; #everything you print after this line will go the file specified by the filehandle $out.

... #your print statements come here.

close $out; #close connection when done to avoid counfusing the rest of the program.

#or you can use the filehandle right after the print statement as in:

print $out "Hello World!\n"; 

或许以下内容会有所帮助:

use strict;
use warnings;

while (<>) {
    my $md5line = `md5sum $_`;
    my @md5arr = split( " ", $md5line );
    printf( "%s\t%s\n", $md5arr[1], $md5arr[0] );
}
使用严格;
使用警告;
而(){
my$md5line=`md5sum$\`;
my@md5arr=split(“,$md5line);
printf(“%s\t%s\n”、$md5arr[1]、$md5arr[0]);
}
用法:
perl mydm5.pl根文件[>md5file]


最后一个可选参数将直接输出到文件md5file;如果不存在,结果将打印到控制台。

实际上不清楚您想要的是什么。你能说得更准确些吗?当你的
标志=1
时,你将不打印任何内容,因为你在标志必须为0的条件下包装了printf语句。好的,我尝试过这个方法,但我的输出文件是空的。我编辑了我的答案。