Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Срез хеш-таблицы через ссылку


Автор: Danissimo 29.1.2007, 20:03
Пусть дан код:
Код

%ht = (
    k1 => 'v1',
    k2 => 'v2'
);
$rf = \%ht;

@keys = qw(k1 k2);
print join(', ', @ht{@keys}) . "\n";


Как записать print, если предположить, что доступна только переменная $rf, а перменная %ht не доступна?

Автор: nitr 29.1.2007, 22:08
Код

#!perl
use strict;

my %ht = (
    k1 => 'v1',
    k2 => 'v2'
);
my $rf = \%ht;

my @keys = qw(k1 k2);
print join(', ', map {$rf->{$_}} @keys) . "\n";


Добавлено @ 22:17 
Код

#!perl
use strict;

my %ht = (
    k1 => 'v1',
    k2 => 'v2'
);
my $rf = \%ht;

my @keys = qw(k1 k2);
print join(', ', @$rf{@keys}) . "\n";


Добавлено @ 22:18 
но чтоб понять напишу так сказать "правильно"
@{ $rf }{@keys}

Автор: Danissimo 30.1.2007, 14:57
В жизни бы не догадался. Спасибо большое, nitr!

Автор: gcc 12.10.2008, 13:02
нашел сабж

Цитата

- DBI::fetchrow_hashref

   $hash_reference = $statement_handle->fetchrow_hashref;

   DBI::fetchrow_hashref работает так же, как DBI::fetchrow_arrayref,
   но возвращает ссылку на ассоциативный, а не на обычный массив.
   Ключами хэша являются имена полей, а значениями - значения в  этой
   строке данных .

   Пример:
   use DBI;
   my $db = DBI->connect('DBI:mSQL:mydata', undef, undef);
   my $query = "SELECT * FROM mytable";
   my $mytable_output = $db->prepare($query);
   $mytable_output->execute;
   my %row1 = $mytable_ouput->fetchrow_hashref;
   my @field_names = keys %row1;
   # @field_names содержит - теперь имена всех полей в запросе .
   # Это делается только один раз . Во всех следующих строках будут те же поля .
   my @row1 = values %row1;



не могу понять как посмотреть что это за данные, @field_names @row1, и как ими воспользоватся?

искал одну вещь, чтобы вывести всю таблицу, например таблица id|name|data|time

если id равняется '2', то посмотреть значения столбцов этой строке например $$hash{'name'} $$hash{'data'} и если бы без цикла, чтобы место не занимало много

UPD: кажется прогнал, можно наверное примерно вот так 
Код

SELECT t1.user,
                                    t1.j,
                                    t2.id,
                             FROM s AS t1,
                                 u AS t2
                                where t1.id='2' 


все равно интересно как посмотреть эти данные  @field_names @row1, дампером не получилось Dumper(@field_names);


Автор: nitr 12.10.2008, 13:23
gcc, зачем зассорять данный топик??? У вас такая привычка?
Я понимаю, что тема может с вашим вопросом совпадает, но никак не с вопросом топик-стартера smile

my %row1 = $mytable_ouput->fetchrow_hashref; тут вообще имхо ошибка
должно быть my $row1 = $mytable_ouput->fetchrow_hashref;
для вашего запроса (SELECT ... WHERE id=2) выводим так:
Код

my $row1 = $mytable_ouput->fetchrow_hashref;
print "Name: ".$row1->{name}." Date: ".$row1->{data};


Добавлено через 1 минуту и 50 секунд
gcc, и читайте документацию perldoc, а не "левые переводы". Я такого не нашел в perldoc.

Добавлено через 3 минуты и 25 секунд
Если вам переводить - то воспользуйтесь translate.google.ru с вводом ссылки perldoc.perl.org smile

Автор: gcc 12.10.2008, 13:31
спасибо, я случайно сюда запостил

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

Автор: nitr 12.10.2008, 13:58
gcc, вам помогло?
Код
my $row1 = $mytable_ouput->fetchrow_hashref;
print "Name: ".$row1->{name}." Date: ".$row1->{data};

Автор: gcc 12.10.2008, 14:17
наверное, пробую, сделаю так...

вот про это с какой-то книги, ошибка была
http://oreilly.com/catalog/msql/errata/msql.unconfirmed


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)