Похоже, здесь есть пара вопросов.
Что я действительно хочу сделать, вместо того чтобы печатать представление дескриптора файла, так это работать с содержимым самих файлов.
Причина, по которой print $fh
возвращает GLOB(0x1a457de8)
, заключается в том, что скаляр $fh
является дескриптором файла, а не содержимым самого файла. Чтобы получить доступ к содержимому самого файла, используйте <$fh>
. Например:
while (my $line = <$fh>) {
print $line;
}
# or simply print while <$fh>;
напечатает содержимое всего файла.
Это задокументировано в pelrdoc perlop
:
Если то, что содержат угловые скобки, является простой скалярной переменной (например,
<$foo>
), тогда эта переменная содержит имя дескриптора файла для
вход из, или его typeglob, или ссылка на то же самое.
Но это уже было опробовано!
Я это вижу. Попробуйте после изменения открытого режима на +<
.
Согласно perldoc perlfaq5
:
Почему, когда я открываю файл для чтения и записи, он стирает его?
Потому что вы используете что-то вроде этого, которое усекает файл
затем дает вам доступ для чтения и записи:
open my $fh, '+>', '/path/name'; # WRONG (almost always)
Упс. Вместо этого вы должны использовать это, что не получится, если файл
не существует:
open my $fh, '+<', '/path/name'; # open for update
Использование ">"
всегда увеличивает или создает. Использование "<"
никогда не помогает.
"+"
не меняет этого.
Само собой разумеется, что or die $!
после open
настоятельно рекомендуется.
Но сделайте шаг назад.
Существует более Perlish способ резервного копирования исходного файла и последующей манипуляции с ним. На самом деле, это можно сделать через саму командную строку (!), Используя флаг -i
:
$ perl -p -i._extjs4 -e 's/foo/bar/g' *.js
Подробнее см. perldoc perlrun
.
Я не могу вписать свои потребности в командную строку.
Если манипуляция слишком велика для командной строки, модуль Tie::File
стоит попробовать.