perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt
Параметры командной строки для Perl описаны в perlrun . Идя слева направо в приведенной выше команде:
Забавный бриллиант - это особый случай оператора 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
.
-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.