LINUX.ORG.RU

Perl - помогите найти ошибку

 


0

1

Пытаюсь написать скрипт проверяющий изменились ли файлы, при помощи утилиты md5sum. Но изменений скрипт не видит, плюс выдает странные значения.

./script text.txt
cat md5.txt 
text.txt||302c3977fb0e4cacebcb39b19380bd18
nano text.txt #Меняем файл
./script text.txt
cat md5.txt 
text.txt||37dae57c382a5f3e025331595d62a5ae #Файл изменен - реакции нет
t||e #Откуда это взялось?
cat script
#!/usr/bin/perl
use strict;

sub md5hash { #Определение хеша
	my $file = shift(@_);
	my ($hash) = (`md5sum \'$file\'` =~ /^(\w*) +$file/);
	return $hash;
	}

open Base, "<", "md5.txt"
	or warn "Не могу открыть базу md5.txt - $!";
open Out, ">", "md5.tmp"
	or warn "Не могу открыть md5.tmp - $!";

my %hash_file; #Открытие базы
for (<Base>) {
	chomp;
	my ($key, $value) = split/||/;
	$hash_file{$key} = $value;
	}
close Base;

my @file = <@ARGV>; #Обработка аргументов
for (@file) {
	my $file = $_;
	if ($hash_file{$file}) {
		my $hash = md5hash($file);
		print "Файл $file - изменен\n" unless $hash ~~ $hash_file{$file}; #Не работает
	} else {
		$hash_file{$file} = md5hash($file)};
}

for (keys %hash_file) {
	print Out "$_||$hash_file{$_}\n";
	#~ print "$_||$hash_file{$_}";
	}
close Out;

rename "md5.tmp", "md5.txt";

Нафиг тут перл ?

 find .  -maxdepth 1 -type f ! -iname 'summ.txt' ! -iname '.*' -exec md5sum -b {} \; > summ.txt

cat summ.txt
5eeadfeab4d0bd8aa6dbc5af7262457c *./a.pl
39bb88573d958fb6074752fa76f58fc0 *./tt.pl
ea0bd2cb2b80307983b2920eaa30dfa4 *./t.pl
22be6321e5f12753bcd6e2677cf5a2d7 *./mbox
e201ece7fa2c9527da725396f12b51c4 *./ask.pl
4419d8eb4cfbd0d1a6810e10d8d8b4bf *./list.c
2bbeaca5346da7e4ad8d3666719ba172 *./files.txt
4ea4c72e4c9eb6af8f2fa59c3d2b5248 *./debian-6.0.4-amd64-netinst.iso
8001d961a4ade939f603c68a32ac30a4 *./nexus-webapp-1.9.2.4.war
e201ece7fa2c9527da725396f12b51c4 *./j.pl
706271880f59c8da2f29759a4a6ac6d3 *./p.pl

vi p.pl

cat summ.txt | md5sum -c
./a.pl: ЦЕЛ
./tt.pl: ЦЕЛ
./t.pl: ЦЕЛ
./mbox: ЦЕЛ
./ask.pl: ЦЕЛ
./list.c: ЦЕЛ
./files.txt: ЦЕЛ
./debian-6.0.4-amd64-netinst.iso: ЦЕЛ
./nexus-webapp-1.9.2.4.war: ЦЕЛ
./j.pl: ЦЕЛ
./p.pl: ПОВРЕЖДЁН
md5sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпали 1 вычисленных контрольных сумм из 11

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Спасибо, возьму на заметку. Но мне важна не задача, а ее решение на perl.

Majesty911
() автор топика

Строку

my ($key, $value) = split/||/;
замени на
my ($key, $value) = split/\|\|/;
или придумай другой разделитель полей.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Спасибо, забыл что split регулярки воспринимает.

Majesty911
() автор топика
Ответ на: комментарий от Majesty911

Тогда ещё скажу, что

for (<Base>) {

лучше писать без использования $_. Повышается читаемость, помогает избегать внезапных ошибок, связанных с изменением переменной по умолчанию внутри цикла. $_ хорош в map, grep и некоторых других ситуациях.

helios ★★★★★
()
Ответ на: комментарий от redgremlin

«@file» планирую дальше использовать, а вот с «my $file = $_» ошибочка вышла.

Majesty911
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.