2013-11-21 3 views
2

Является новым для Perl и пытается создать хэш из текстового файла. У меня есть текстовый файл, внешний для кода, который предназначен для редактирования другими людьми. Предполагается, что они должны быть знакомы с Perl и знать, где редактировать. Текстовый файл по существу содержит несколько хэшей хэшей, в комплекте с надлежащим синтаксисом, отступы и т. Д., Как и обычный код Perl. Ключи и значения будут отличаться, но весь хэш хэшей будет иметь одинаковую глубину.Perl Hash From Text File

Вопрос: Как прочитать этот файл в своем коде и использовать эти хэши?

В процессе обучения я попробовал «открыть (FILE)», затем «while», но бросать каждую строку в @rray не сохраняет хеши. Или мне нужно использовать каждую строку для создания нескольких хэшей хэшей внутри моего кода?

Thnx за любую помощь.

Rod

ответ

2

Это очень просто:

my $nested_hash = do "your_file.txt"; 

Так что если your_file.txt содержит что-то вроде:

{ 
    a => 1, 
    b => [1,2,3], 
    c => { 
    c1 => 42 
    c3 => { 
     c11 => 21 
    } 
    } 
} 

Тогда $nested_hash может быть использован как:

$nested_hash->{a} # equals 1 
$nested_hash->{b} # the array reference [1,2,3] 

$nested_hash->{c}->{c1} # equals 42 

В внешнем текстовом файле вы также можете иметь более одной структуры данных; просто определите их как список, разделенный ,.

В your_file.txt:

{ 
    a => 1, 
    b => [1,2,3], 
}, 
{ 
    c => 3, 
    d => 4, 
} 

Затем вы читаете их из сценария, вы используете списочный контекст:

my @nested_hashes = do "your_file.txt"; 

Так

$nested_hashes[0]->{a} # gives you 1 
$nested_hashes[1]->{c} # gives you 3 
+0

Thnx, Файз. Моя вина за то, что я недостаточно ясна из-за моей неопытности. Я предполагаю, что я ищу, чтобы скопировать всю структуру хэша в этот внешний файл в мой код и работать над ним как хэш. Сегодня существует только один хеш хешей. Завтра может быть два или более, поскольку другие добавили то, что они хотят в файл. На следующий день их не будет. Rod – Rod

+0

Я вижу. Помогает ли моя последняя помощь? – Faiz

+0

Thnx, Faiz. То, что вы отправили, определенно поможет мне в будущем, но на данный момент мне все же нужно найти некоторые способы быстро разложить весь контент этого файла и увидеть его как список хэшей хэшей. У меня может не быть другого выбора, кроме как жестко закодировать sub для работы над отдельными строками для создания внутреннего хеша из массива. Один хеш будет выглядеть примерно так: ключ -> под-ключ -> значения. На следующей неделе, кто-то может добавить: ключа -> под-ключ -> значение значение -> под-ключ -> значение На следующий день, кто-то может добавить его с 3 суб-ключей с различными значения. И мне придется работать над всеми из них. – Rod

0

Так у вас есть файл хэшей , назовем его bar.pm:

our $hash = { 
     a => 1, 
     b => [1,2,3], 
    }, 
    { 
     c => 3, 
     d => 4, 
    } ; 

our $hosh = { 
     v => 1, 
     w => [1,2,3], 
    }, 
    { 
     x => 3, 
     y => 4, 
    } ; 

1; 

Теперь следующий код в другой сценарий:

use strict; 
use warnings ; 
use Data::Dumper ; 

require('bar.pm') ; 
our $hash ; 
our $hosh ; 
print Dumper $hash ; 
print Dumper $hosh ; 

ли то, что вы хотите, как print Dumper показывает

Вы все еще должны знать, какие хэши, где они определены в bar.pm файлах, хотя, потому что вам нужно our их в вас код. Чтобы избежать этого, вы можете определить в bar.pm мастер-хэш хэшей.

я, вероятно, никогда не будет делать это сам, если только потому, что:

«Предположение о том, что они должны быть знакомы с Perl и будет знать, где редактировать»

Кажется несколько опасно , В CPAN существует несколько конфигурационных модулей, которые, вероятно, будут намного лучше.

0

Использование данных :: Dumper.

Сначала создайте структуру данных и сохраните их в файле.

use Data::Dumper; 

my $hash = { 
    'k1' => 'v1', 
    'k2' => 2, 
}; 

open my $output, '>', 'data' or die $!; 
print $output Dumper $hash; 

Файл data должен выглядеть следующим образом:

$VAR1 = { 
      'k2' => 2, 
      'k1' => 'v1' 
     }; 

Это редактируемые людьми.

Теперь, если вы хотите получить обратно данные в программу (после того, как человека редактирования, например):

my $hash = do 'data';