Perl 5: Срезы хэшей могут заменить циклы | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translated in draft, editing and proof-reading required.
If you do not want to register an account, you can sign in with OpenID.
Perl 5: Hash slices can replace loops | ||
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, чтобы выполнить простое действие над хэшем, а потом вас посещала мысль: скорее всего, есть более подходящий способ сделать это? Использование срезов хэшей вместо простых циклов позволит сократить объем кода и ускорить выполнение вашего скрипта. | |
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.) | Срез хэшей - это синтаксическое средство для доступа к множеству значений через одно строчную операцию. Это краткая и эффективная техника, но это также и один из представителей той коллекции примеров кода, из-за которой Перл приобрёл репутацию нечитабельного языка программирования. Однако, изучив эту технику, вы почувствуете себя более искусным в программировании человеком! Я хочу представить парочку примеров того, как срезы хэшей помогли сделать мой код короче и быстрее. (Обратите также внимание, что вы также можете делать срезы массивов, но сегодня мы обсуждаем только хэши). | — Почему пропущено то, что можно также делать срезы массивов? — oxa |
Basic hash slice syntax | ||
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. | Вы получите срез хэша, если используете список ключей вместо единственного скалярного ключа и замените символ $, используемый для получения скалярного результата, на символ @ для получения массива. | — Такой вариант: Вы получите срез хэша, если используете список ключей вместо единственного скалярного ключа и замените символ $, используемый для получения скалярного результата, на символ @ для получения массива. — mitry-alexandrov |
my %number_for = (one => 1, two => 2, three => 3); | my %number_for = (one => 1, two => 2, three => 3); | — может перевести на русский ключи хэша? — adolgushin — не стоит — flamey — В книгах по программированию никто переменные и вообще код не переводит. — oxa |
# Regular access to scalar key | ||
print $number_for{one}; # 1 | ||
# Hash slice accesses multiple keys. Note the '@' | # Срез хэша выполняет доступ по нескольким ключам. Обратите внимание на @ | |
print @number_for{qw(one two three)}; # 123 | ||
# This also works | ||
print @number_for{'one','two','three'}; # 123 | ||
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 сделает это за вас. При использовании же срезов вы обязаны заключать имя каждого ключа хэша в кавычки. | — скобочки - это, должно быть, всё-таки кавычки: одинарные - ' или двойные - ". — mitry-alexandrov |
Merging two hashes | ||
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. | Срез хэша может находиться с левой стороны от оператора присвоения. Это свойство используется для слияния одного хэша в другой. Общим примером слияния может служить то, когда вы получаете конфигурационные данные более чем из одного источника, но вы хотите объединить их в одном месте. | — может оставить lvalues в скобках - это термин у которого нет устоявшегося аналога в русском — mitry-alexandrov — Согласна, lvalue - это термин в программировании и целевая аудитория его знает. — oxa |
my %your_numbers = (two => 2, four => 4, six => 6); | my %your_numbers = (two => 2, four => 4, six => 6); | |
# I get all your numbers! | ||
# (And your number will override mine if they differ) | # И твои числа (%your_numbers) заменят мои, если они разнятся | |
@number_for{keys %your_numbers} = values %your_numbers; | @number_for{keys %your_numbers} = values %your_numbers; | |
print sort values %number_for; # 12346 | ||
Accessing keys in a particular order | ||
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"!) | — (Точно проверили?) — mitry-alexandrov |
© хз. License: хз

— GTrends говорит что правильно "хэш" а не "хеш" - поверим ему? — hunlong
— да — flamey
— Не стоит. «Э» обычна поначалу в заимствованных словах, но постепенно заменяется на «е». Такое свойство у русского языка. — dionys