Есть ли причины когда-либо использовать форму open (...) с двумя аргументами в Perl? - PullRequest
2 голосов
/ 27 ноября 2009

Есть ли причины когда-либо использовать форму с двумя аргументами open(...) в Perl, а не версии с тремя или более аргументами?

Единственная причина, по которой я могу прийти, это очевидное наблюдение, что форма с двумя аргументами короче. Но если предположить, что многословие не является проблемой, есть ли другие причины, которые заставили бы вас выбрать форму с двумя аргументами open(...)?

Ответы [ 9 ]

7 голосов
/ 27 ноября 2009

Открытие с одним и двумя аргументами применяет все слои по умолчанию, указанные с помощью переключателя -C или open pragma. Трех арг открывать не надо. На мой взгляд, эта функциональная разница является самой сильной причиной выбора того или иного (и выбор будет зависеть от того, что вы открываете). Что является самым простым или наиболее описательным или «самым безопасным» (вы можете безопасно использовать двухаргументное открытие с произвольными именами файлов, это просто не так удобно) отойти на задний план в коде модуля; в коде сценария вы можете по своему усмотрению выбирать, будете ли вы поддерживать слои по умолчанию или нет.

Кроме того, открытие оператора одним аргументом необходимо для оператора удаления файла Дамиана Конвея

$_ = "filename";
$contents = readline!open(!((*{!$_},$/)=\$_));
6 голосов
/ 27 ноября 2009

Представьте, что вы пишете утилиту, которая принимает имя входного файла. Люди с достаточным опытом работы с Unix привыкли заменять STDIN -. Perl обрабатывает это автоматически, только когда используется магическая форма , где символы режима и имя файла представляют собой одну строку, в противном случае вам придется обрабатывать этот и подобные особые случаи самостоятельно. Это довольно распространенная ошибка, я удивлен, что никто еще не опубликовал это. Доказательство:

use IO::File qw();
my $user_supplied_file_name = '-';

IO::File->new($user_supplied_file_name, 'r') or warn "IO::File/non-magical mode - $!\n";
IO::File->new("<$user_supplied_file_name")   or warn "IO::File/magical mode - $!\n";
open my $fh1, '<', $user_supplied_file_name  or warn "non-magical open - $!\n";
open my $fh2, "<$user_supplied_file_name"    or warn "magical open - $!\n";

__DATA__
IO::File/non-magical mode - No such file or directory
non-magical open - No such file or directory
5 голосов
/ 27 ноября 2009

Еще одно небольшое отличие: два аргумента в форме пробелов

$foo = " fic";
open(MH, ">$foo");
print MH "toto\n";

Записывает в файл с именем fic

С другой стороны

$foo = " fic";
open(MH, ">", $foo);
print MH "toto\n";

Запишет в файл, имя которого начинается с пробела.

Для коротких административных сценариев с пользовательским вводом (или вводом файла конфигурации) не нужно беспокоиться о таких деталях, как обрезка имен файлов.

4 голосов
/ 27 ноября 2009

Форма с двумя аргументами open была единственной формой, поддерживаемой некоторыми старыми версиями perl.

3 голосов
/ 27 ноября 2009

Одна из причин использовать версию open с двумя аргументами - если вы хотите открыть что-то, что может быть каналом или файлом. Если у вас есть одна функция

sub strange
{
     my ($file) = @_;
     open my $input, $file or die $!;
}

тогда вы хотите вызвать это либо с именем файла наподобие "file":

strange ("file");

или канал типа "zcat file.gz |"

strange ("zcat file.gz |");

в зависимости от ситуации с файлом, который вы найдете, тогда можно использовать версию с двумя аргументами. Вы фактически увидите вышеописанную конструкцию в «устаревшем» Perl. Однако наиболее разумным может быть правильное открытие дескриптора файла и отправка дескриптора файла функции, а не использование имени файла, подобного этому.

3 голосов
/ 27 ноября 2009

Я думаю пост Уильяма в значительной степени ударил его. В противном случае форма с тремя аргументами будет более понятной и безопасной.

Смотри также:

3 голосов
/ 27 ноября 2009

Если вы открываете из канала, форма с тремя аргументами не очень полезна. Получение эквивалента формы с тремя аргументами включает в себя безопасное открытие канала (open(FILE, '|-')) и затем выполнение программы.

Таким образом, для простых открытий канала (например, open(FILE, 'ps ax |')) синтаксис с двумя аргументами гораздо более компактен.

2 голосов
/ 27 ноября 2009

Когда вы комбинируете строку или используете переменную, может быть довольно непонятно, есть ли уже '<' или '>' и т.д. В таких случаях я лично предпочитаю удобочитаемость, то есть я использую более длинную форму:

open($FILE, '>', $varfn);

Когда вы просто используете константу, я предпочитаю простоту ввода (и, на самом деле, считаю, что короткая версия в любом случае лучше читаема или, по крайней мере, даже длинной).

open($FILE, '>somefile.xxx');
0 голосов
/ 27 ноября 2009

Полагаю, вы имеете в виду open(FH, '<filename.txt'), а не open(FH, '<', 'filename.txt')?

Я думаю, это просто вопрос предпочтений. Я всегда использую первое по привычке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...