-1

我创建了一个文件“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);
4

3 回答 3

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";
}

}

于 2013-10-13T21:11:28.770 回答
0

如果您不提供FILEHANDLEprintprintf,则输出将转到STDOUT(控制台)。

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

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"; 
于 2013-10-13T21:17:15.623 回答
0

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

use strict;
use warnings;

while (<>) {
    my $md5line = `md5sum $_`;
    my @md5arr = split( " ", $md5line );
    printf( "%s\t%s\n", $md5arr[1], $md5arr[0] );
}

用法:perl mydm5.pl rootfile [>md5file]

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

于 2013-10-13T21:34:30.573 回答