2010-05-11 139 views

回答

20
perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt 

Perl的命令行选项记录在perlrun中。从上面的命令从左到右:

  • -M Digest::SHA1=sha1_hex加载在编译时和进口sha1_hexDigest::SHA1模块,这给摘要以十六进制形式。
  • -l自动添加一个换行符的任何print
  • -e年底推出被执行

的Perl代码看起来很有趣的钻石是Perl的readline运营商的一个特殊情况:

空文件句柄<>是特殊的:它可以用来模拟sedawk的行为。来自<>的输入来自标准输入或来自命令行上列出的每个文件。以下是它的工作原理:第一次对<>进行评估时,将检查@ARGV阵列,如果它是空的,则将$ARGV[0]设置为"-",打开时会为您提供标准输入。然后将@ARGV数组作为文件名列表进行处理。

因为secure.txt被命名为命令行中的唯一文件,其内容将成为参数sha1_hex

使用Perl版本5.10或更高版本,您可以缩短上面的单行五个字符。

perl -MDigest::SHA=sha1_hex -E 'say sha1_hex<>' secure.txt 

代码丢弃可选的(用Perl的所有版本)空白<>之前,滴剂-l,并从-e-E开关。

  • -E commandline

    行为就像-e,但它隐含启用所有可选功能(在主编译单元)。见feature

其中的一个可选的特征是say,这使得不必要-l

  • say FILEHANDLE LIST
  • say LIST
  • say

    就像print,而是含蓄地追加一个换行符。 say LIST简直是

    { local $\ = "\n"; print LIST } 
    

    缩写时,启用say功能,此关键字仅适用:看feature

如果你想有一个方便实用的代码,说mysha1sum.pl,然后用

#! /usr/bin/perl 

use warnings; 
use strict; 

use Digest::SHA1; 

die "Usage: $0 file ..\n" unless @ARGV; 

foreach my $file (@ARGV) { 
    my $fh; 
    unless (open $fh, $file) { 
    warn "$0: open $file: $!"; 
    next; 
    } 

    my $sha1 = Digest::SHA1->new; 
    $sha1->addfile($fh); 
    print $sha1->hexdigest, " $file\n"; 

    close $fh; 
} 

这将计算摘要名为在命令行上的每个文件,输出格式与Unix sha1sum实用程序兼容。

C:\> mysha1sum.pl mysha1sum.pl mysha1sum.pl 
8f3a7288f1697b172820ef6be0a296560bc13bae mysha1sum.pl 
8f3a7288f1697b172820ef6be0a296560bc13bae mysha1sum.pl 

你没有说你是否已经安装了Cygwin,但如果这样做,sha1sum是coreutils软件包的一部分。

+3

+1对于Perl高尔夫洞穴合一 – amphetamachine 2010-05-11 15:58:58

+2

如此多的信息.​​.....如果我可以的话我会+2! – MiffTheFox 2010-05-11 16:28:13

+0

非常清楚。正是我需要的。谢谢! – Jim 2010-05-11 16:35:38

-1

使用Digest::SHA1像这样:

#!/usr/bin/perl -w 
use strict; 

use Digest::SHA1 qw/ sha1_hex /; 

# open file 
open IN_DATA, "<secure.txt" or die "cannot open file secure.txt for reading: $!"; 
# read in all file contents 
my $file_contents; 
{local $/; $file_contents = <IN_DATA>;} 
# close file 
close IN_DATA; 
print &sha1_hex($file_contents); 

编辑:为什么向下票呢?这段代码不起作用吗?这不是解决问题的恰当方法吗?

+6

请使用本地词法文件句柄 - '打开我的$ in_data,'<','secure.txt'或死...' – Ether 2010-05-11 16:10:00

+0

@其他 - 这是个人喜好的问题。 – amphetamachine 2010-05-11 21:13:18

+4

有很好的理由使用词法句柄。请参阅http://stackoverflow.com/questions/1479741/why-is-three-argument-open-calls-with-lexical-filehandles-a-perl-best-practice – daotoad 2010-05-11 23:53:56

5

尝试Digest::SHA模块。

C:\> perl -MDigest::SHA -e "print Digest::SHA->new(1)->addfile('secure.txt')->hexdigest"