Perl. При перезаписи файла возникают дубли на UNIX SunOS
Сделал скрипт на Perl. Смысл его в том, чтобы перезаписывать значения в файлах (работа со списком) Проверил на Win - работа корректная, на UNIX создаются дубли с одинаковым названием файла:
-bash-3.00$ ls -la
total 13210122
drwxr-xr-x+ 2 adm 4096 Sep 19 10:58 .
drwxr-xr-x+ 5 adm 96 Sep 19 11:10 ..
-rw-r--r--+ 1 adm 180143028 Sep 18 11:11 CMExport_BEL_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 180136758 Sep 19 10:44 CMExport_BEL_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 155967287 Sep 18 11:15 CMExport_BRN_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 155961633 Sep 19 10:45 CMExport_BRN_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 162663698 Sep 18 11:06 CMExport_IVN_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 162658484 Sep 19 10:45 CMExport_IVN_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 76585106 Sep 18 11:12 CMExport_KLG_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+ 1 adm 76582356 Sep 19 10:46 CMExport_KLG_RNC_0.0.0.0_2017091806.xml
Причем в первом случае это 'документ XML' а во втором 'файл XML'
Подскажите пожалуйста как вылечить?
OC - SunOS oss-adapters-collector 5.10 Generic_142900-11 sun4v sparc SUNW,T5440
Пример кода:
use warnings;
use strict;
use diagnostics;
use POSIX 'strftime';
my $dateprev = strftime '%Y%m%d',localtime(time-172800);
my @file = `ls -a /directory/$dateprev`;
shift @file;
shift @file;
for(my $i=0; $i<@file; $i++)
{
my $filename = "/directory/$dateprev/$file[$i]";
open(SESAME, $filename) or die "I can not open '$filename' $!";
my @data = <SESAME>;
close(SESAME);
my $what = '<NULL>';
my $then = ' ';
foreach ( @data ) {
s{\Q$what\E}{$then};
}
#Записываем в файл массив
open(my $fh, '>', $filename) or die "I can not open '$filename' $!";
foreach (@data)
{
print $fh "$_"; # Print each entry in our array to the file
}
close $fh;
}






Ответы - Perl. При перезаписи файла возникают дубли на UNIX SunOS / Perl. При перезаписи файла возникают дубли на UNIX SunOS

19.09.2017 12:45:41
Хотя список файлов и был подредактирован, но ошибку нашел.
Вся проблема заключается в том, что используется
my @file = `ls -a /directory/$dateprev`;
элементарный вывод Dumper(@file)
сразу бы показал, что там есть переводы строк в конце. Поэтому, имена файлов все таки различны. Это кстати, и вывод ls показал, делая сам вывод немного "необычным". Почему под виндой оно отработало нормально - не знаю. Может драйвер файловой системы сам все пофиксил.
Как исправить. Можно по старинке, имена файлов обработать chop/chomp или регуляркой вида `s/\n$//g/.
А можно вместо строки
my @file = `ls -a /directory/$dateprev`;
написать так
my @file = glob("/directory/$dateprev/*");
В этом случае имена будут с путями, что немного упростит дальнейший код.


while(</directory/$dateprev/*>)
вместо for

while(</directory/$dateprev/*>)
будет перебирать все файлы?


$_
будут находится имена файлов. можете для теста выполнить такой цикл поставив внутрь print, увидите в каком они виде.

19.09.2017 12:49:41
разобрался в чем причина, а именно в том что в конец файла записывается перевод каретки, и нужно применить:
chomp $file[$i];
в цикле FOR.