Dlaczego trzy-argumentowe otwarte wywołania z autovivified filehandles są najlepszą praktyką Perla?

Mam dwa pytania dotyczące funkcji Perla open:

1) wydaje mi się, że z Perl Best Practices pamiętam, że 3-argumentowa wersja open jest lepsza od wersji dwóch argumentów, np.

open(OUT, '>>', $file);

Vs.

open(OUT, ">>$file");
Dlaczego? Próbowałem komuś powiedzieć, żeby użył wersji 3-argumentowej, ale nie mogłem jej jakoś poprzeć.

2) zdaję się również pamiętać, że autowiwifikowane filehandles były faworyzowane przez bareword filehandles (nazwali coś innego)? A także nie pamiętam dlaczego, np.

open(my $out, '>>', $file);

Vs.

open(OUT, '>>', $file);

Czy to coś strict? Wydaje mi się, że pamiętam możliwość używania OUT z strict, ale nie pamiętam.

Author: ThisSuitIsBlackNot, 2009-09-26

3 answers

  • używanie typeglobów dla filehandle (jak OUT) nie jest dobrym pomysłem, ponieważ są one globalne dla całego programu - musisz mieć pewność ,że żadna inna procedura, w tym Moduły, nie będzie używać tej samej nazwy (również w przyszłości).
  • użycie dwuargumentowej formy open naraża Twoją aplikację na niewłaściwe zachowanie spowodowane zmiennymi zawierającymi znaki specjalne, na przykład {[2] } jest narażone na błąd, w którym $some_filename zawierający wiodący {[4] } zmieni program zachowanie.

Użycie formy trzech argumentów pozwala uniknąć tego poprzez rozdzielenie trybu i nazwy pliku na oddzielne argumenty, w których nie mogą one ingerować.

Co więcej, Używanie formularza dużo argumentów z pipes jest bardzo dobrym pomysłem:

open $pipe, '|-', 'sendmail', '[email protected]';

Jest lepsze niż robienie tego wszystkiego jako pojedynczy ciąg-pozwala uniknąć ewentualnego wtrysku powłoki itp.

 62
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-11 11:48:36

#2:

OUT jest to globalny plik i korzystanie z niego naraża Cię na podstępne błędy, takie jak ten: {]}

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;
 14
Author: mob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 23:44:20

Należy pamiętać, że forma dwuargumentowa jest złamana. Rozważ plik o nazwie " abc " (to znaczy nazwę pliku z pustym znakiem wiodącym). Nie można otworzyć pliku:

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

Spacja zostaje upuszczona i plik nie może być już znaleziony. Taki scenariusz jest wysoce nieprawdopodobny, ale zdecydowanie problem. Forma trójargumentowa jest odporna na to:

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

Ten wątek z perlmonks jest równie dobrą dyskusją jak każda z kwestii. Wystarczy pamiętać, że w 2001 roku trzy arg form był nadal uważany za Nowy , a więc nie nadaje się do przenośnego kodu, ponieważ programy Perla umarłyby z błędem składni, gdyby były uruchamiane na interpreterze 5.005. Tak już nie jest: perl 5.005 jest przestarzały.

 12
Author: dland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-26 17:03:12