2015-08-24 3 views
-2

Внутри переменной Я хотел бы сцепить другой переменной:Perl: объединить переменную внутри переменной?

my %hash = (
DNS_AD_toto => ['10.0.0.1'], 
DNS_OP_toto => ['192.168.0.2', '10.0.0.2'], 
DNS_ZA_toto => ['192.168.0.3'], 
); 

foreach my $abc ("AD", "OP"){ 
    print $DNS_${abc}_toto[0]; 
} 

print $DNS_$a_toto[0] Но не работает, потому что $DNS_ не существует. Итак, как объединить две переменные только в одной строке?

+0

Это действительно трудно сказать, что вы просите здесь - пожалуйста, вы можете взять момент для рассмотрения и уточнения вашего вопроса? Пожалуйста, обратитесь к [ask] за то, что делает хороший вопрос. Код - хорошее начало, но мы не можем сказать, каковы ваши желаемые результаты. – Sobrique

+1

Я укажу, что - вы назначаете анонимный хэш '{}' массиву. '@ DNS_AD_toto' - это не очень хорошо работает. Аналогично - ваш 'eq' использует строку без кавычек, которая будет номером _version_, а не тем, что вы намереваетесь. И ваш цикл foreach - вы не включаете имена массивов. Пожалуйста, включите 'strict;' и 'warnings;', потому что это поможет вам написать код, который работает. – Sobrique

+1

Существует также '$ a', которое является зарезервированным именем переменной, которое используется в' sort' blocks/subs рядом с '$ b'. Вместо этого выберите значащие имена переменных. – simbabque

ответ

1

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

  • Включите use strict; и use warnings;. Исправьте все возникшие ошибки - это должны быть первые две строки всего, что вы пишете.
  • my @DNS_AD_toto = {'10.0.0.1', '10.0.0.2'};, вероятно, не делает то, что, по вашему мнению, делает.

{} обозначить анонимные хеши. Так что вы создаете здесь анонимный хэш, а затем вставляете его в массив. Ваш массив длиннее одного элемента и содержит пару ключ-значение. Это почти наверняка не то, что вы хотели.

.: например

$VAR1 = [ 
      { 
      '10.0.0.1' => '10.0.0.2' 
      } 
     ]; 
  • Как уже упоминалось в комментариях - не использовать $a - это зарезервированный переменная sort. На самом деле - не используйте имена переменных одной буквы. Для этого редко есть веская причина.

  • Вы говорите о символических ссылках - это неприятно. Не. Вместо этого используйте хэш. Смотрите здесь более подробно: http://perl.plover.com/varvarname.html

Что вы вероятно хочу:

my %DNS_toto = (
    'AD' => [ '10.0.0.1', '10.0.0.2' ], 
    'OP' => [ '192.168.0.1', '192.168.0.2' ], 
); 
print Dumper \%DNS_toto; 

Что дает:

$VAR1 = { 
      'AD' => [ 
        '10.0.0.1', 
        '10.0.0.2' 
        ], 
      'OP' => [ 
        '192.168.0.1', 
        '192.168.0.2' 
        ] 
     }; 

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

Edit: После обновления вопрос:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my %hash = (
    DNS_AD_toto => ['10.0.0.1'], 
    DNS_OP_toto => [ '192.168.0.2', '10.0.0.2' ], 
    DNS_ZA_toto => ['192.168.0.3'], 
); 

foreach my $abc ("AD", "OP") { 
    print $hash{ "DNS_" . $abc . "_toto" }[0], "\n"; 
} 

В качестве альтернативы:

foreach my $key ("DNS_AD_toto", "DNS_OP_toto") { 
    print $hash{$key},"\n"; 
} 

Или:

foreach my $abc (grep {m/(AD|OP)/} keys %hash) { 
    print $hash{$abc}[0], "\n"; 
} 
+0

Спасибо за помощь :) thx – user5259591

2

Не пытайтесь генерировать код.

my %DNS_toto = (
    AD => [ '10.0.0.1', '10.0.0.2' ], 
    OP => [ '192.168.0.1', '192.168.0.2' ], 
); 

for my $foo (qw(AD OP)) { 
    if ($DNS_toto{$foo}[0] eq '192.168.0.2') { 
     ... 
    } 

    ... 
} 
2

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

use strict; 
use warnings; 

my %hash = (
    DNS_AD_toto => ['10.0.0.1', '10.0.0.2'], 
    DNS_OP_toto => ['192.168.0.1', '192.168.0.2'], 
); 

foreach my $s ("AD", "OP") { 
    my $key = "DNS_${s}_toto"; 

    if($hash{$key}[0] eq "192.168.0.2") { 
    print 'It is AD' 
    } 
    if($hash{$key}[0] eq "10.0.0.2") { 
    print 'It is OP' 
    } 

} 
Смежные вопросы