shoorick: (Default)
[personal profile] shoorick
Чтобы не забыть. С двумерными массивами в перле можно работать так:
#!/usr/bin/perl -w
use strict;


# Так можно задать массив заранее известных чисел
my      @arr = (
                        [1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 9]
        );
my      @row = qw(20 21 22);

print $arr[1][1];       # 5

# Так можно добавить строку в массив
push(@arr, [10, 11, 12]);
# И так можно
push(@arr, [@row]);

print $arr[3][0];       # 10
print $arr[4][2];       # 22

@row = qw(33 34 35);
push(@arr, \@row);      # Другой способ присваивания. С подвохом
print $arr[5][2];       # 35

@row = qw(44 45 46);    # И тут вдруг меняется 5-й ряд.

Плюс к тому — man perlref.

Date: 2006-09-06 01:56 pm (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
А вообще-то в Perl нет никаких массивов кроме одномерных. Однако элементом одномерного массива может быть ссылка на другой массив, именованый или анонимный. Это полностью перекрывает весь потенциал многомерных массивов, и, в добавок, позволяет делать вещи недоступные многомерным массивам.
# "Двумерный" массив с переменным размером
@arr = (
    [1, 2, 3],
    [4, 5],
    [6]
);

# Массив переменной размерности
@arr = (
    [[1, 2], [3, 4]],
    [5, 6],
    7
);

# Массив с различным типом содержимого
@arr = (
    [[1, 2], {name => 'vasya'} ],
    sub { print $_[0] + $_[1] },
    7
);

# Массив с "дыркой"
my @arr2;
$arr2[0] = 1;
$arr2[5] = 2;

@arr = (1, undef, undef, undef, undef, 2);
# Массив @arr2 и @arr похожи, но не идентичны!


а синтаксис $arr[3][0] на самом деле является сокращенной формой написания $arr[3]->[0]. Кстати, варианты присваивания:
@row = qw(33 34 35);

и
@row = (33, 34, 35);

не идентичны, хотя и во многих случаях взаимозаменяемы. Дело в том, что первый вариант идентичен:
@row = ('33', '34', '35');

и сохраняет строковые представления, которые
будут автоматически конвертированы в целочисленные
при необходимости. Разница видна в примере:
my @a = qw(12.700 13.0 010 00);
my @b = (12.700, 13.0, 010, 00);
print join("\t", @a), "\n";
print join("\t", @b), "\n";

который выведет:
12.700  13.0    010     00
12.7    13      8       0

Date: 2006-09-06 02:58 pm (UTC)
From: [identity profile] mikkka.livejournal.com
вобще то тут не двуерный массив а банально массив ссылок на массив. можно ещё массив ссылок на хеши, хеш ссылок на массив, и вобще чего в голову придёт. причём делается это с минимумом напрягов по части синтаксиса - чем мне перл и люб. синтаксис правда зачастую ибанутый.

Массив ссылок

Date: 2006-09-07 04:09 am (UTC)
From: [identity profile] shoorick.livejournal.com
Знаю. Но иногда меня тоже клинит на предмет синтаксиса. Потому и забубениваю тмакие посты, чтобы было, куда подсмотреь по-быстрому.

Re: Массив ссылок

Date: 2006-09-07 04:13 am (UTC)
From: [identity profile] mikkka.livejournal.com
а. я обычно шукаю в своих скриптах.

Где шукать

Date: 2008-03-13 01:58 pm (UTC)
From: [identity profile] shoorick.livejournal.com
А мне лениво рыться по сриптам — вот и кидаю всё в ЖыЖу.

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 21st, 2026 10:43 am
Powered by Dreamwidth Studios