LINUX.ORG.RU

[perl] первый элемент массива

 


0

0

Я всегда думал что приведённые ниже строки абсолютно эквивалентны.

my ($string) = @array;
my $string = $array[0];
В виду подсознательной нелюбви к явному указанию адресов, всегда пользовался первой записью. Однако только что обнаружил (ещё как обнаружил, но речь не про то) что если массив содержит что-то вроде 01, 02, 03, то первая запись присвоит $string соответствующие число. Почему оно так и есть ли возможность таки обойтись без явного указания элемента массива?

★★★★★

Последнее исправление: KblCb (всего исправлений: 1)

my $string = $array[$[];

Покатит?

nnz ★★★★
()
Ответ на: комментарий от wfrr

wfrr

совершенно нечитабельно, даже после с++

Сдаюсь. Я готов поверить что смотрится говном что-то вроде этого:

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)$/);
}
Но что не читаемого ты нашёл в приведённых двух строчках? Покажи мне читаемый код (питон не предлагать), который в сравнении с этими строчками будет выглядеть понятно.

KblCb ★★★★★
() автор топика

Однако только что обнаружил (ещё как обнаружил, но речь не про то) что если массив содержит что-то вроде 01, 02, 03, то первая запись присвоит $string соответствующие число.

Пример покажи, потому как

my @arr = qw/01 02 03/;
my ($first) = @arr;
print $first,"\n";

выводит 01

anonymous
()
Ответ на: комментарий от anonymous

Проверил. Единственная ситуация в которой я наблюдаю подобное поведение это вот этот кусок кода. Решительно ничего не понимаю.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от wfrr

совершенно нечитабельно, даже после с++

совершенно не согласен, особенно про C++.

erfea ★★★★★
()
Ответ на: комментарий от wfrr

wfrr

array.get(0)

Хитрый какой. А присвоение? Я уж не говорю про явное обращение к первому элементу массива

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

> Хитрый какой.

Скорее толстый и зелёный.

Я уж не говорю про явное обращение к первому элементу массива

car же, coolface.jpg

anonymous
()
Ответ на: комментарий от KblCb

set, и оператор точки, если элемент объект то те хватит. Зойчем эти секасы с скобками собаками и баксами.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

А вообще ООП головного мозга (которое кстати делает код ещё более запутанным при грамматном использовании) есть в perl6 (и таки да, он уже есть и вполне готов для релиза в Эстонии).

KblCb ★★★★★
() автор топика
Ответ на: комментарий от wfrr

wfrr

Зойчем эти секасы с скобками собаками и баксами.

Ну... Первый вариант это всего навсего копирование одного массива в другой и скобки тут примерно для это:

my ($track, $next_track, $next_next_track) = @tracks;
Мне вот интересно как ты краше присвоишь n первых элементов массива n переменным. Со второй строкой всё гораздо хуже. Мне вот совершенно не понятно зачем надо было придумывать один синтаксис для обращения к хэш-таблицам и другой для обращения к элементу массива. Ну сигилы после C/С++ очень утомляют.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

кстати делает код ещё более запутанным при грамматном использовании

Ну и кто тут зеленее?

wfrr ★★☆
()
Ответ на: комментарий от wfrr

>array.operations.standart.get(numbers.decimal.small.zero)

починено для большего ънтерпрайза

anonymous
()
Ответ на: комментарий от KblCb
while (scalar @cue_table) { 
    my $string = shift @cue_table; 

while (my $string = shift @cue_table) {

foreach (@cue_table){ 
  и вместо $string исп. $_
@tracks = ($1, @tracks);

unshift @tracks, $1;
sdio ★★★★★
()
Ответ на: комментарий от KblCb

Так в условии задачи про незыблемость массива ничего не говорилось.

Впрочем за что люблю перл, что там любой извращенец реализует свои самые грязные фантазии

break && $string = $_ foreach reverse @array;
SunBurn
()
Ответ на: комментарий от SunBurn

Тогда reverse убери. Долго думал как это работает, а когда понял - ужаснулся. Кстати а в perl5 разве допустимо ставить foreach после оператора?

KblCb ★★★★★
() автор топика
Ответ на: комментарий от sdio

За scalar спасибо, что-то я и правда странное придумал. От foreach я отказался исключительно из-за того что вариант с shift'ом постепенно выкидывает из памяти весь массив по мере потери необходимости в нём. А касательно unshift'а: мне всегда казались диковатыми функции висящие в воздухе (то есть не возвращающие значения или значение которых не проверяется). Даже не знаю который из двух вариантов лучше... (На самом деле я просто забыл про unshift)

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

от синтаксического сахара часто слипается и получаются запоры, которые со временем перерастают в гимморой.

wfrr ★★☆
()
Ответ на: комментарий от KblCb

Тогда reverse убери.

Да, реверс я по инерии поставил. Не нужен.

Долго думал как это работает, а когда понял - ужаснулся.

Да ладно, постфисная завись + управление потоком черед логические операции - обычное дело

Кстати а в perl5 разве допустимо ставить foreach после оператора?

И не только foeach, но и for, while, unless, if. Довольно компактно и прозрачно получается, если надо выполнить всего один рператор

SunBurn
()
Ответ на: комментарий от SunBurn

SunBurn

И не только foeach, но и for, while, unless, if.

А вот этого не знал. Мне почему-то казалось что оное позиционируется как фича perl6.

KblCb ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.