Я всегда думал что приведённые ниже строки абсолютно эквивалентны.
my ($string) = @array;
my $string = $array[0];
В виду подсознательной нелюбви к явному указанию адресов, всегда пользовался первой записью. Однако только что обнаружил (ещё как обнаружил, но речь не про то) что если массив содержит что-то вроде 01, 02, 03, то первая запись присвоит $string соответствующие число. Почему оно так и есть ли возможность таки обойтись без явного указания элемента массива?
Сдаюсь. Я готов поверить что смотрится говном что-то вроде этого:
while (scalar @cue_table) {
my $string = shift @cue_table;
my $track = $tracks[0] || "zero";
$string =~ s/\r\n/\n/g;
$img_file = dirname($cue_file)."/$1" if (!$img_file and $string =~ /FILE \"(.*)\"[^"]*$/);
@tracks = ($1, @tracks) if ($string =~ /TRACK +(\d+)/);
$genre{$track} = $1 if ($string =~ /REM GENRE +(?:\"|)([^\"].+[^\"])(?:\"|)(?:\r|\n)$/);
$date{$track} = $1 if ($string =~ /REM DATE +(\d+.+)(?:\r|\n)/);
$performer{$track} = $1 if ($string =~ /PERFORMER +\"(.+)\"/);
$title{$track} = $1 if ($string =~ /TITLE +\"(.+)\"(?:\r|\n)$/);
}
Но что не читаемого ты нашёл в приведённых двух строчках? Покажи мне читаемый код (питон не предлагать), который в сравнении с этими строчками будет выглядеть понятно.
Однако только что обнаружил (ещё как обнаружил, но речь не про то) что если массив содержит что-то вроде 01, 02, 03, то первая запись присвоит $string соответствующие число.
Пример покажи, потому как
my @arr = qw/01 02 03/;
my ($first) = @arr;
print $first,"\n";
А вообще ООП головного мозга (которое кстати делает код ещё более запутанным при грамматном использовании) есть в perl6 (и таки да, он уже есть и вполне готов для релиза в Эстонии).
Ну... Первый вариант это всего навсего копирование одного массива в другой и скобки тут примерно для это:
my ($track, $next_track, $next_next_track) = @tracks;
Мне вот интересно как ты краше присвоишь n первых элементов массива n переменным. Со второй строкой всё гораздо хуже. Мне вот совершенно не понятно зачем надо было придумывать один синтаксис для обращения к хэш-таблицам и другой для обращения к элементу массива. Ну сигилы после C/С++ очень утомляют.
За scalar спасибо, что-то я и правда странное придумал. От foreach я отказался исключительно из-за того что вариант с shift'ом постепенно выкидывает из памяти весь массив по мере потери необходимости в нём. А касательно unshift'а: мне всегда казались диковатыми функции висящие в воздухе (то есть не возвращающие значения или значение которых не проверяется). Даже не знаю который из двух вариантов лучше... (На самом деле я просто забыл про unshift)