Там - это a Модуль CPAN , который предоставляет метод unread
для класса IO::Handle
.Тем не менее, его предупреждения делают один несколько осторожным.Я бы тщательно оценил его пригодность.
Если вам действительно нужно всего лишь сэкономить 500 строк, каждая из которых достаточно короткая, этого модуля может быть достаточно;в его примере используется STDIN
.
Однако я нервничаю из-за магии ARGV.Если ваш оператор <>
вызывает открытие и чтение нескольких отдельных файлов, то я не знаю, что вы сможете создать резервную копию файла, отличного от того, который открыт в данный момент.
Вы могли бы в конечном итоге просто написать логику возврата.Либо это, либо наложение каких-то ограничений на обработку ARGV, связанных с несколькими входными файлами и / или характером STDIN
.
Большинство моих программ с магической обработкой ARGV имеют в начале защиту, которая читает что-то вроде
if (@ARGV == 0 && -t STDIN) {
# select one or the other of the next two lines:
# opt 1: emit warning
warn "$0: reading stdin from /dev/tty\n";
# opt 2: populate @ARGV
@ARGV = grep { -f && -T } <*>; # glob plain textfiles
}
Во втором вышеприведенном случае, где по умолчанию используются все обычные текстовые файлы в текущем каталоге, следует также решить, что делать, если grep
создает пустой список.
Для некоторых программ, которые ожидают или, по крайней мере, допускают аргументы каталога, вместо этого я иногда инициализирую пустой @ARGV
- "."
, чтобы программа по умолчанию использовала текущий рабочий каталог процесса.