Perl 5: Срезы хэшей могут заменить циклы

хз, “Perl 5: Hash slices can replace loops”, public translation into Russian from English More about this translation.

See also 139 similar translations

Translate into another language.

Participants

dzhariy488 points
adolgushin182 points
flamey114 points
And others...
Join Translated.by to translate! If you already have a Translated.by account, please sign in.
If you do not want to register an account, you can sign in with OpenID.
Pages: ← previous Ctrl next
1 2

Perl 5: Hash slices can replace loops

Perl 5: Срезы хэшей могут заменить циклы

History of edits (Latest: hunlong 3 years, 10 months ago) §

How many times have you written a for loop to do something simple with a hash and thought, there must be a better way to do this? Using hash slices instead of simple loops can save you lines of code and execution time.

Часто ли было у вас так, что вы писали цикл for, чтобы выполнить простое действие над хэшем, а потом вас посещала мысль: скорее всего, есть более подходящий способ сделать это? Использование срезов хэшей вместо простых циклов позволит сократить объем кода и ускорить выполнение вашего скрипта.

History of edits (Latest: hunlong 3 years, 10 months ago) §

— GTrends говорит что правильно "хэш" а не "хеш" - поверим ему? hunlong

— да flamey

— Не стоит. «Э» обычна поначалу в заимствованных словах, но постепенно заменяется на «е». Такое свойство у русского языка. dionys

A hash slice is a syntax for accessing the values of multiple keys of a hash in a single statement. It is a succinct and efficient technique, but it is also one of those collections of punctuation that give Perl a reputation as a write-only language. Once you have learned it, however, you will feel much more clever! Here are a few examples of how I use hash slices to make my code shorter and faster. (Note that you can also slice arrays, but today we are just talking about hashes.)

Срез хэшей - это синтаксическое средство для доступа к множеству значений через одно строчную операцию. Это краткая и эффективная техника, но это также и один из представителей той коллекции примеров кода, из-за которой Перл приобрёл репутацию нечитабельного языка программирования. Однако, изучив эту технику, вы почувствуете себя более искусным в программировании человеком! Я хочу представить парочку примеров того, как срезы хэшей помогли сделать мой код короче и быстрее. (Обратите также внимание, что вы также можете делать срезы массивов, но сегодня мы обсуждаем только хэши).

History of edits (Latest: zibsoft 1 year, 6 months ago) §

— Почему пропущено то, что можно также делать срезы массивов? oxa

Basic hash slice syntax

Базовый синтаксис срезов

History of edits (Latest: dzhariy 3 years, 11 months ago) §

You perform a hash slice by using a list as a hash index, rather than a scalar value, and preceding with the @ sigil rather than the $ sigil you would use to get a scalar value.

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

History of edits (Latest: mitry-alexandrov 3 years, 10 months ago) §

— Такой вариант: Вы получите срез хэша, если используете список ключей вместо единственного скалярного ключа и замените символ $, используемый для получения скалярного результата, на символ @ для получения массива. mitry-alexandrov

my %number_for = (one => 1, two => 2, three => 3);

my %number_for = (one => 1, two => 2, three => 3);

History of edits (Latest: adolgushin 3 years, 10 months ago) §

— может перевести на русский ключи хэша? adolgushin

— не стоит flamey

— В книгах по программированию никто переменные и вообще код не переводит. oxa

# Regular access to scalar key

# Обычный доступ по скалярному ключу

History of edits (Latest: dionys 3 years, 10 months ago) §

print $number_for{one}; # 1

print $number_for{one}; # 1

History of edits (Latest: adolgushin 3 years, 10 months ago) §

# Hash slice accesses multiple keys. Note the '@'

# Срез хэша выполняет доступ по нескольким ключам. Обратите внимание на @

History of edits (Latest: adolgushin 3 years, 10 months ago) §

print @number_for{qw(one two three)}; # 123

print @number_for{qw(one two three)}; # 123

History of edits (Latest: adolgushin 3 years, 10 months ago) §

# This also works

# Можно и так

History of edits (Latest: flamey 3 years, 11 months ago) §

print @number_for{'one','two','three'}; # 123

print @number_for{'one','two','three'}; # 123

History of edits (Latest: adolgushin 3 years, 10 months ago) §

A cautionary note: notice how the scalar index uses a bare word as the key. Perl gives you the quoting for free in this case. With a slice, Perl doesn't help, so you have to do the quoting yourself.

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

History of edits (Latest: dionys.myopenid.com 3 years, 5 months ago) §

— скобочки - это, должно быть, всё-таки кавычки: одинарные - ' или двойные - ". mitry-alexandrov

Merging two hashes

Слияние двух хэшей

History of edits (Latest: hunlong 3 years, 10 months ago) §

Since hash slices can be lvalues, they can be used to merge one hash into another. A common example is when you get configuration information from more than one source, but you want to consolidate it to look up in just one place.

Срез хэша может находиться с левой стороны от оператора присвоения. Это свойство используется для слияния одного хэша в другой. Общим примером слияния может служить то, когда вы получаете конфигурационные данные более чем из одного источника, но вы хотите объединить их в одном месте.

History of edits (Latest: hunlong 3 years, 10 months ago) §

— может оставить lvalues в скобках - это термин у которого нет устоявшегося аналога в русском mitry-alexandrov

— Согласна, lvalue - это термин в программировании и целевая аудитория его знает. oxa

my %your_numbers = (two => 2, four => 4, six => 6);

my %your_numbers = (two => 2, four => 4, six => 6);

History of edits (Latest: flamey 3 years, 11 months ago) §

# I get all your numbers!

# У меня все твои числа!

History of edits (Latest: flamey 3 years, 11 months ago) §

# (And your number will override mine if they differ)

# И твои числа (%your_numbers) заменят мои, если они разнятся

History of edits (Latest: adolgushin 3 years, 10 months ago) §

@number_for{keys %your_numbers} = values %your_numbers;

@number_for{keys %your_numbers} = values %your_numbers;

History of edits (Latest: flamey 3 years, 11 months ago) §

print sort values %number_for; # 12346

print sort values %number_for; # 12346

History of edits (Latest: adolgushin 3 years, 10 months ago) §

Accessing keys in a particular order

Получение значений ключей в заданном порядке

History of edits (Latest: dzhariy 3 years, 11 months ago) §

Here is a common thing you run into in web development. You have received input from a web form and validated it. (You have validated it, right?) The data lives in a hash, and you want to store it in a database. You have your SQL statement all prepared, but it requires that the values be bound in exact column order. Unfortunately, the values function cannot be relied upon to return the values in the order you want. (And besides, you don't want to store the value of the submit button!)

Вот общий пример, который встречается в веб-программировании. Вы получили данные формы и уже проверили их. (Точно проверили?) Данные формы находятся в хэше и вы хотите сохранить их в базу данных. У вас уже есть подготовленный SQL-запрос, но для его выполнения требуется, чтобы порядок ваших значений точно соответствовал порядку полей таблицы, заданных в запросе. К сожалению, функция values не может обеспечить тот порядок следования значений хэша, который вам необходим. (К тому же, вы вряд ли хотите сохранять значение для кнопки "submit"!)

History of edits (Latest: mitry-alexandrov 3 years, 10 months ago) §

— (Точно проверили?) mitry-alexandrov

Pages: ← previous Ctrl next
1 2

© хз. License: хз