Как я могу использовать хеши в качестве аргументов подпрограммам в Perl?

Устранена проблема, из-за которой сегодня на моем компьютере было то же самое, переименовав запись в моем реестре:

После некоторого копания может возникнуть несколько проблем, которые могут вызвать одну и ту же ошибку (приложение, настройки, реестр) , Эта запись в блоге довольно хорошо освещает это: http://www.armedia.com/blog/2012/08/sql-server-management-studio-freeze/

В моем случае удаление папка студии управления SQL-сервером в AppData (c: \ users \% userName% Appdata \ raoming \ microsoft \) не работала.

Однако я успешно удалил / переименовал запись реестра: [HKEY_CURRENT_USER \ Software \ Microsoft \ Microsoft SQL Server]

(обновление). Решил основную проблему на моем ноутбуке - использовались дополнительные 2 экрана с намного более высокие разрешения, которые заставили Windows / SSMS открыть диалог подключения к новому источнику данных для всех из них. Если вы используете несколько экранов, попробуйте вернуться, чтобы просто использовать собственный экран ноутбука, чтобы увидеть, сможете ли вы найти диалог, который SSMS ожидает на вашем входе.

7
задан brian d foy 3 June 2009 в 16:35
поделиться

4 ответа

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

Чтобы обойти эту проблему, вы должны вместо этого передать ссылки:

my %hash1 = ( foo => 'bar' );
my %hash2 = ( bar => 'baz' );
subroutine( \%hash1, \%hash2 );

sub subroutine {
    my ( $hashref1, $hashref2 ) = @_;
    print $hasref1->{foo}, $hashref2->{bar};
}

PS: Помимо концептуальной проблемы, ваш код также имеет следующее:

my %d  = @_;     
my %i  = @_;     

Если% d и% i имеют одинаковое значение, это не должно вызывать удивления, если впоследствии они останутся такими же.

25
ответ дан 6 December 2019 в 05:43
поделиться

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

some_sub( \%hash );
some_sub( { key => 'value' } );
some_sub( $hash_ref );

sub some_sub {
    my( $hash_ref ) = @_;

    ...
    }
5
ответ дан 6 December 2019 в 05:43
поделиться
use strict;
use warnings;

sub get_result {

  ...

  print_result( $id, \%diet, \%iq );
  # or
  print_result( $id, {%diet}, {%iq} );
}


sub print_result{
  my( $id, $diet_h, $iq_h ) = @_;
  my %diet = %$diet_h;
  my %iq = %$iq_h;

  ...

}

Или:

use strict;
use warnings;

sub print_result($\%\%);

sub get_result{

  ...

  print_result($id, %diet, %iq);
}

sub print_result($\%\%){
  my( $id, $diet_h, $iq_h ) = @_;
  my %diet = %$diet_h;
  my %iq = %$iq_h;

  ...

}
0
ответ дан 6 December 2019 в 05:43
поделиться

Когда вы передаете % diet и % iq , они оба сглаживаются в массив arg, поэтому в вашем print_result , % d содержит все элементы в % diet и % iq .

Для решения используйте ссылки из ]% diet и % iq :

print_result($id, \%diet, \%iq);

Затем в print_result :

my $id = shift;
my %d  = %{+shift};
my %i  = %{+shift};
3
ответ дан 6 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

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