У меня есть файл под названием secure.txt в c:\temp. Я хочу выполнить команду Perl из командной строки для печати хеша SHA1 secure.txt. Я использую ActivePerl 5.8.2. Я не использовал Perl прежде, но это - самая удобная опция, доступная прямо сейчас.
perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt
Параметры командной строки для Perl задокументированы в perlrun . Переход слева направо в приведенной выше команде:
-M Digest :: SHA1 = sha1_hex
загружает модуль Digest :: SHA1 во время компиляции и импортирует sha1_hex
, что дает дайджест в шестнадцатеричной форме. -l
автоматически добавляет новую строку в конец любого print
-e
вводит код Perl для выполнения Забавный на вид ромбик - это особый случай Perl Оператор readline
:
Нулевой дескриптор файла
<>
является особенным: его можно использовать для имитации поведенияsed
иawk
. Ввод из<>
поступает либо из стандартного ввода, либо из каждого файла, указанного в командной строке.Вот как это работает: при первой оценке<>
проверяется массив@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
.
Одной из этих дополнительных функций является скажем
, что делает ненужным -l
.
Если вы хотите использовать этот код в удобной утилите, скажем 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.
Попробуйте модуль Digest::SHA.
C:\> perl -MDigest::SHA -e "print Digest::SHA->new(1)->addfile('secure.txt')->hexdigest"
Используйте 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);
Редактировать: Почему голосование "против"? Этот код не работает? Разве это не подходящее решение проблемы?