Как я могу найти переменные, разделенные уникальным символом? - PullRequest
0 голосов
/ 30 марта 2011

Я не очень знаком с Perl, но мне интересно, можно ли это сделать?

Итак, у меня есть файл, который выглядит так:

Stringa = Stringx Stringz
Stringb = Stringy
Stringc = Stringw Stringx Stringu

Где с левой стороны у меня есть одно слово. На правой стороне у меня есть несколько слов. Я хочу создать хеш-таблицу, где ключом является слово слева (т.е. строка), а значением является массив, содержащий элементы справа (т.е. строка x stringz). С правой стороны элементы разбиты только пробелами, и мне нужно включить - * $ @, весь этот мусор.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 30 марта 2011

Примерно так:

my %hash;
foreach my $line (@lines) {
  chomp $line;
  my ( $key, $value ) = split ' = ', $line;
  my @elems = split '\s+', $value;
  $hash{$key} = \@elems;
}

Ваш хеш будет обозначен строками в левой части =, а ваши значения будут ссылками на массивы, основанные на правой стороне =.

2 голосов
/ 31 марта 2011

Просто чтобы вы могли видеть, что есть линейные способы сделать это:

my %hash 
    = map { $_->[0] => [ split /\s+/, $_->[1] ] } 
      map { chomp; [ split /\s*=\s*/, $_, 2 ]   } 
      <DATA>
    ;

__DATA__
Stringa = Stringx Stringz
Stringb = Stringy
Stringc = Stringw Stringx Stringu

Черт возьми, пока вы это делаете, если вы добавите File::Slurp, вы можете сделать это:

use File::Slurp qw<read_file>;
my %hash 
    = map { $_->[0] => [ split /\s+/, $_->[1] ] } 
      map { chomp; [ split /\s*=\s*/, $_, 2 ]   }
      # now you can have #-comments in your file 
      grep { !m/^\s*#/ } 
      read_file( $my_config_path )
    ;
1 голос
/ 30 марта 2011

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

my %hash;
while (<>) {
   chomp;
   my ($key, $val) = split(/' = '/, $_);
   push @{ $hash{$key} }, split(/\s+/, $val);
}

my @abcs = @{ $hash{abc} };
my $abc = $hash{abc}[0];

В отличие от ранее опубликованных решений, этопринимает дубликаты ключей, если они произошли.

1 голос
/ 30 марта 2011
#!/usr/bin/perl -w

my $hash = {};
while (my $line = <DATA>) {
  chomp($line);
  my @vals = split(/(?: = | )/, $line);
  my $key = shift(@vals);
  $hash->{$key} = \@vals;
}

for (keys %$hash) {
  print "OK: $_ => ", join(', ', @{$hash->{$_}}), "\n";
}

__END__
Stringa = Stringx Stringz
Stringb = Stringy
Stringc = Stringw Stringx Stringu
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...