Вы должны использовать версию с тремя аргументами, потому что она защищает от файлов с сумасшедшими именами. Учтите следующее:
my $file = "<file.txt";
open( INPUTFILE, "< $file" ) or die "$!";
Это будет интерполировать как:
open( INPUTFILE, "< <file.txt" ) or die "$!";
... означает, что вы действительно откроете файл с именем file.txt
вместо одного с именем <file.txt
.
Теперь для дескриптора файла вы хотите использовать лексический дескриптор файла:
open( my $fh, "<", $file.txt ) or die "$!";
Причина этого в том, что когда $fh
выходит из области видимости, файл закрывается. Кроме того, другой тип файлового дескриптора (я не помню, как он называется) имеет global scope. Программисты не настолько изобретательны, так что, вероятно, вы назовете свой дескриптор файла INPUTFILE
или FH
или FILEHANDLE
. Что произойдет, если кто-то еще сделал то же самое, назвал свой дескриптор файла INPUTFILE
в модуле, который вы используете? Ну, они оба действительны, и один забивает другой. Какой из них раздолбает? Кто знает. Это до заказа, когда они открыты. И повторюсь? А что произойдет, если другой программист открыл INPUTFILE
, но фактически открыл его для записи? Конец света, друг мой, конец света.
Если вы используете лексический файловый дескриптор ($fh
), вам не нужно беспокоиться об окончании миров, потому что даже если другой программист вызывает его $fh
, переменная область действия защищает вас от ударов.
Так что да, всегда используйте форму с тремя аргументами open()
с лексическими дескрипторами файлов. Спасти мир.