Почему являются прослушивания с тремя аргументами с автооживляемыми дескрипторами файлов лучшей практикой Perl?

Большинство предложений здесь будет работать, но результаты испытаний на коде jQuery показывают, что чистые идентификационные селекторы являются безусловно самыми быстрыми. Тот я чаще всего использую:

$("[id$=origControlId]")

является довольно медленным, но проблема не слишком очевидна, если страница не имеет много средств управления и много jQuery.

С тех пор это довольно безболезненный для присвоения нескольких классов управлению, Вы могли дать каждому CSSClass, который соответствует идентификатору. Так как они затем были бы уникальны (необходимо будет следить за средствами управления типом повторителя, которые генерируют несколько средств управления), Вы могли выбрать классом.

, Например:

<asp:Label ID="Label1" CssClass="Label1 SomeOtherClass" runat="server" Text="test">
</asp:Label>

мог быть выбран исключительно:

$(".Label1")

, Который является почти с такой скоростью, как идентификационный выбор.

я никогда не рассматривал этого:

$('#<%= Label1.ClientID %>')

, но я собираюсь попробовать его!

45
задан ThisSuitIsBlackNot 7 January 2016 в 15:50
поделиться

3 ответа

  • Использование typeglobs для дескрипторов файлов (например, OUT ) не является хорошей идеей, поскольку они глобальны для всей вашей программы - вы должны быть уверены, что никакая другая процедура, включая те, в модулях используют то же имя (в том числе в будущем).
  • Использование формы с двумя аргументами open подвергает ваше приложение неправильному поведению, вызванному переменными, содержащими специальные символы, например my $ f; open $ f, "> $ some_filename"; подвержен ошибке, когда $ some_filename , содержащее начальную > , изменит поведение программы.

Использование трех- Форма аргументов позволяет избежать этого, разделяя режим и имя файла на отдельные аргументы, где они не могут вмешиваться.

Более того, использование формы множества аргументов с конвейерами - очень хорошая идея:

64
ответ дан 26 November 2019 в 21:10
поделиться

Решение № 2:

OUT - это глобальный дескриптор файла, использование которого подвергает вас коварным ошибкам, подобным этой:

sub doSomething {
  my ($input) = @_;
  # let's compare $input to something we read from another file
  open(F, "<", $anotherFile);
  @F = <F>; 
  close F;
  &do_some_comparison($input, @F);
}

open(F, "<", $myfile);
while (<F>) {
    &doSomething($_);   # do'h -- just closed the F filehandle
}
close F;
16
ответ дан 26 November 2019 в 21:10
поделиться

Один аспект, который следует иметь в виду, это что форма с двумя аргументами нарушена. Рассмотрим файл с именем «abc» (то есть имя файла с пробелом в начале). Вы не можете открыть файл:

open my $foo, ' abc' or die $!;
open my $foo, '< abc' or die $!;
open my $foo, '<  abc' or die $!;
# nothing works

Место сбрасывается, и файл больше не может быть найден. Такой сценарий маловероятен, но определенно является проблемой. Форма с тремя аргументами невосприимчива к этому:

open my $foo, '<', ' abc' or die $!;
# works

Эта ветка от perlmonks является таким же хорошим обсуждением, как и любая другая проблема. Просто имейте в виду, что в 2001 году форма с тремя аргументами все еще считалась новой и, следовательно, не подходила для переносимого кода, поскольку программы Perl умирали с синтаксической ошибкой при запуске в интерпретаторе 5.005. Это уже не так:

13
ответ дан 26 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: