Каково различие между хешем и ссылкой хеша в Perl?

Я всегда использовал метод как

public static final byte[] fromHexString(final String s) {
    String[] v = s.split(" ");
    byte[] arr = new byte[v.length];
    int i = 0;
    for(String val: v) {
        arr[i++] =  Integer.decode("0x" + val).byteValue();

    }
    return arr;
}

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

63
задан brian d foy 25 May 2010 в 21:55
поделиться

4 ответа

Простой хеш близок к массиву. Их инициализации даже похожи. Сначала массив:

@last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Теперь давайте представим ту же информацию с помощью хеша (он же ассоциативный массив):

%last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Хотя они имеют одинаковое имя, массив @last_name и хэш % last_name полностью независимы.

С массивом, если мы хотим узнать фамилию Арчи, мы должны выполнить линейный поиск:

my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
  $lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";

С хешем он намного более прямой синтаксически:

print "Archie $last_name{Archie}\n";

Допустим, мы хотим для представления информации с немного более богатой структурой:

  • Тесак (фамилия)
    • Уорд (имя)
    • Джун (имя супруги)
  • Флинтстон
    • Фред
    • Вильма
  • Бункер
    • Арчи
    • Эдит

До того, как появились ссылки, плоские хэши «ключ-значение» были примерно лучшим из того, что мы могли сделать, но ссылки позволяют

my %personal_info = (
    "Cleaver", {
        "FIRST",  "Ward",
        "SPOUSE", "June",
    },
    "Flintstone", {
        "FIRST",  "Fred",
        "SPOUSE", "Wilma",
    },
    "Bunker", {
        "FIRST",  "Archie",
        "SPOUSE", "Edith",
    },
);

На внутреннем уровне ключи и значения % personal_info все являются скалярами, но значения представляют собой особый вид скаляров: хеш-ссылки, созданные с помощью {} . Ссылки позволяют моделировать «многомерные» хэши. Например, мы можем добраться до Вильмы через

$personal_info{Flintstone}->{SPOUSE}

. Обратите внимание, что Perl позволяет нам опускать стрелки между индексами, поэтому приведенное выше эквивалентно

$personal_info{Flintstone}{SPOUSE}

. Это много ввода, если вы хотите узнать больше о Фреде, поэтому вы можете взять ссылка как своего рода курсор:

$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";

Поскольку $ fred в приведенном выше фрагменте является хэш-ссылкой, стрелка необходима. Если вы не укажете его, но включите с умом , используйте strict , чтобы помочь вам отловить такого рода ошибки компилятор пожалуется:

Global symbol "%fred" requires explicit package name at ...

Ссылки Perl похожи на указатели в C и C ++, но они никогда не могут быть нулевыми. Указатели в C и C ++ требуют разыменования, как и ссылки в Perl.

Параметры функций C и C ++ имеют семантику передачи по значению: они просто копии, поэтому изменения не возвращаются вызывающей стороне. Если вы хотите увидеть изменения, вам нужно передать указатель. Вы можете получить этот эффект со ссылками в Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

Без обратной косой черты, add_barney получил бы копию, которая была бы выброшена, как только подгруппа вернется.

Обратите внимание также на использование "fat". запятая "( => ) выше. Он автоматически заключает строку в кавычки и делает инициализацию хеша менее синтаксически шумной.

но они никогда не могут быть нулевыми. Указатели в C и C ++ требуют разыменования, как и ссылки в Perl.

Параметры функций C и C ++ имеют семантику передачи по значению: они просто копии, поэтому изменения не возвращаются вызывающей стороне. Если вы хотите увидеть изменения, вам нужно передать указатель. Вы можете получить этот эффект со ссылками в Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

Без обратной косой черты, add_barney получил бы копию, которая была бы выброшена, как только подгруппа вернется.

Обратите внимание также на использование "fat". запятая "( => ) выше. Он автоматически заключает строку в кавычки и делает инициализацию хеша менее синтаксически шумной.

но они никогда не могут быть нулевыми. Указатели в C и C ++ требуют разыменования, как и ссылки в Perl.

Параметры функций C и C ++ имеют семантику передачи по значению: они просто копии, поэтому изменения не возвращаются вызывающей стороне. Если вы хотите увидеть изменения, вам нужно передать указатель. Вы можете получить этот эффект со ссылками в Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

Без обратной косой черты, add_barney получил бы копию, которая была бы выброшена, как только подгруппа вернется.

Обратите внимание также на использование "fat". запятая "( => ) выше. Он автоматически заключает строку в кавычки и делает инициализацию хеша менее синтаксически шумной.

поэтому изменения не возвращаются вызывающему. Если вы хотите увидеть изменения, вам нужно передать указатель. Вы можете получить этот эффект со ссылками в Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

Без обратной косой черты, add_barney получил бы копию, которая была бы выброшена, как только подгруппа вернется.

Обратите внимание также на использование "fat". запятая "( => ) выше. Он автоматически заключает строку в кавычки и делает инициализацию хеша менее синтаксически шумной.

поэтому изменения не возвращаются вызывающему. Если вы хотите увидеть изменения, вам нужно передать указатель. Вы можете получить этот эффект со ссылками в Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

Без обратной косой черты, add_barney получил бы копию, которая была бы выброшена, как только подгруппа вернется.

Обратите внимание также на использование "fat". запятая "( => ) выше. Он автоматически заключает строку в кавычки и делает инициализацию хеша менее синтаксически шумной.

87
ответ дан 24 November 2019 в 16:19
поделиться

Ниже показано, как можно использовать хэш и ссылку на хэш:

my %hash = (
    toy    => 'aeroplane',
    colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";

my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";

См. Также perldoc perldsc .

16
ответ дан 24 November 2019 в 16:19
поделиться

Хеш - это базовый тип данных в Perl. Он использует ключи для доступа к своему содержимому.

Ссылка на хэш - это сокращение от ссылка на хеш. Ссылки скаляры, то есть простые значения. это скалярное значение, содержащее по сути, указатель на актуальный сам хэш.

Ссылка: разница между хешем и хеш-ссылкой в ​​perl - Форумы Ubuntu

Разница также в синтаксисе для удаления. Как и C, perl работает следующим образом для хэшей:

delete $hash{$key};

и для ссылок на хеш

delete $hash_ref->{$key};

Perl Hash Howto - отличный ресурс для понимания хешей и хеширования со ссылками на хеш

. здесь, где есть дополнительная информация о perl и ссылки .

10
ответ дан 24 November 2019 в 16:19
поделиться

См. perldoc perlreftut , который также доступен из командной строки вашего компьютера.

Ссылка - это скалярное значение, которое относится к весь массив или целый хэш (или что-то еще). Имена - это один из видов ссылок, с которыми вы уже знакомы. Подумайте о президенте Соединенных Штатов: беспорядочный, неудобный мешок крови и костей. Но чтобы говорить о нем или представлять его в компьютерной программе, все, что вам нужно, это простая и удобная скалярная строка «Барак Обама».

Ссылки в Perl подобны именам массивов и хешей. Это частные внутренние имена Perl, поэтому вы можете быть уверены в их однозначности. В отличие от «Барака Обамы», ссылка относится только к одной вещи, и вы всегда знаете, к чему она относится. Если у вас есть ссылка на массив, вы можете восстановить из него весь массив. Если у вас есть ссылка на хеш, вы можете восстановить весь хеш. Но ссылка по-прежнему представляет собой простое компактное скалярное значение.

7
ответ дан 24 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: