Вопрос:
Ниже код является частью скрипта, в котором я объединять файлы разных каталогов. После слияния я копирую оставшиеся файлы в конечный каталог. Слияние работает нормально, но при копировании файлов я получаю
cp: missing destination file operand after ‘/users/abc/perl_scripts/temp_dir/b.cc’ Try ‘cp —help’ for more information. sh: line 1: /users/abc/perl_scripts/temp: is a directory for $k(dir1) { $flag=0; for $j(@dir2) { if(«$k» eq «$j») { &merge_gcov(«$UERRC1/$k»,»$UERRC2/$k»,»$DATA_DIR/$k»); $flag=1; last; } } if($flag == 0) { #print «>>>>>>>>>>>>> cp $UERRC1/$k $DATA_DIR/$k n»; ‘cp $UERRC1/$k,$DATA_DIR’; } }
Может ли кто-нибудь помочь мне разрешить это…
Лучший ответ:
Всякий раз, когда вы используете системные вызовы, вы, скорее всего, делаете что-то избыточное, и в этом случае оно явно избыточно. Perl очень способен копировать файлы. Я рекомендую модуль File::Copy, который является основным модулем в perl 5. Используя его просто:
use File::Copy qw(copy); copy $from, $to or die $!; # it is a good idea to check if the copy failed
Кроме того, вместо того, чтобы перебирать все имена файлов в @dir2 и видеть, совпадает ли имя с именем в $k, почему бы просто не проверить, существует ли файл в другом каталоге? Например
if (-e «$UERRC1/$k») { # check if file exists merge_gcov(«$UERRC1/$k», «$UERRC2/$k», «$DATA_DIR/$k»); } else { copy «$UERRC1/$k», $DATA_DIR or die $!; }
Документация для теста файла -e находится в perldoc -f «-X»
Вы действительно должны использовать имена переменных, которые более подходят. Это сделает ваш код более читабельным и гораздо более легким для обслуживания и отладки.
Также…
Прежде чем делать что-либо еще, вы должны добавить в свой скрипт следующие две строки и исправить ошибки, которые, несомненно, появятся:
use strict; use warnings;
strict заставит вас объявить все переменные (как правило, с my $foo), который будет удален с целью обнаружения ошибок из-за опечаток в именах переменных. Сообщение об ошибке будет читать “Глобальный символ $ foo требует явного имени пакета…”.
warnings дадут вам информацию о том, что вы делаете неправильно. Это хорошая вещь.
Ответ №1
Аргументы cp имеют вид cp from to, но у вас есть cp from,to.
Возможно, поэтому он жалуется на количество аргументов – $UERRC1/$k,$DATA_DIR – единственный аргумент. Он должен быть cp $UERRC1/$k $DATA_DIR, как в вашем заявлении на печать.