Строка Perl работает в 30 раз быстрее с одинарными кавычками, чем с двойными кавычками

У нас есть задача изменить некоторые строки в двоичных файлах на нижний регистр (со смешанного / верхнего / любого другого). Соответствующие строки являются ссылками на другие файлы (это связано с обновлением, при котором мы также переходим с Windows на Linux в качестве серверной среды, поэтому случай внезапно стал иметь значение). Мы написали сценарий, который использует для этого цикл perl. У нас есть каталог, содержащий около 300 файлов (общий размер каталога составляет около 150 МБ), так что это некоторые данные, но не большие объемы.

Следующий код Perl выполняет работу около 6 минут:

for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'` 
do
    (( updated++ ))
    write_line "Converting case of string: $file_ref "
    perl -i -pe "s{(?i)$file_ref}{$file_ref}g" $forms6_convert_dir/* 
done

а следующий код Perl занимает более 3 часов!

for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'` 
do
    (( updated++ ))
    write_line "Converting case of string: $file_ref "
    perl -i -pe 's{(?i)$file_ref}{$file_ref}g' $forms6_convert_dir/* 
done

Кто-нибудь может объяснить, почему? Дело в том, что $ file_ref остается как строка $ file_ref, а не заменяется значением в версии с одинарными кавычками? В таком случае, что он заменяет в этой версии? Мы хотим заменить все вхождения любого имени файла самим собой b но строчными буквами. Если мы запускаем строки в файлах до и после и ищем имена файлов, то оба, похоже, внесли одинаковые изменения. Однако, если мы запускаем diff для файлов, созданных двумя циклами (diff firstloop / file1 secondloop / file1), то он сообщает, что они отличаются.

Это выполняется из сценария bash в Linux.

6
задан Adam 5 August 2011 в 13:30
поделиться