Конечная запятая в Perl списке

Элементы в списке в языке программирования Perl разделяются с помощью оператора запятая ,. Вот пример кода, который создает массив в котором находится 3 элемента:

▶ Run
#!/usr/bin/perl

my @arr = ('one', 'two', 'three');

Perl, в отличии от, например, JSON позволяет указывать запятую в конце списка. Этот код создает точно такой же массив как и в прошлом примере:

▶ Run
#!/usr/bin/perl

my @arr = ('one', 'two', 'three',);

Этот массив состоит из трех элементов. То что в конце есть запятая ни на что не влияет. Можно было бы предположить что наличие запятой в конце списка добавит undef в качестве последнего значения, но нет, этого не происходит. Если ли запятая в конце списка или нет — это никак не влияет то как Perl интерпретирует этот список.

Рекомендация

Языку программирования Perl все равно — есть ли в списке конечная запятая или нет, но программы пишутся не только чтобы их понимал Perl, но для того чтобы их понимали люди. Поэтому есть следующая рекомендация, если ей следовать, то код становится чуть-чуть проще читать и немного проще изменять.

Рекомендация следующая:

  • если список записан в строку, то конечной запятой быть не должно
  • если каждый элемент списка записан в отдельной строке, то после последнего элемента должна быть запятая

Из этой рекомендации следует что

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

Вот пример кода в котором соблюдается эта рекомендация:

▶ Run
#!/usr/bin/perl

my @arr1 = ('one', 'two', 'three');

my @arr2 = (
    'one',
    'two',
    'three',
);

my %h = (
    a => 1,
    b => 2,
);

Если в списке, каждый элемент которого записан в строку нет конечно запятой и нужно добавить еще один элемент в конец списка, то в diff будет состоять из одной удаленной строки и двух добавленных:

diff --git a/script.pl b/script.pl
index 5634af0..eabe2f1 100644
--- a/script.pl
+++ b/script.pl
@@ -3,5 +3,6 @@
 my @arr = (
     'one',
     'two',
-    'three'
+    'three',
+    'four'
 );

Если же рекомендация соблюдается и в конце такого списка есть конечная запятая, то diff состоит из одной понятной строки:

diff --git a/script.pl b/script.pl
index 8575677..82b3adf 100644
--- a/script.pl
+++ b/script.pl
@@ -4,4 +4,5 @@ my @arr = (
     'one',
     'two',
     'three',
+    'four',
 );

Другие статьи

Комментарии