Что такое Perl's $; переменная для? - PullRequest
9 голосов
/ 04 февраля 2010

Имеет ли кто-нибудь 1 какое-либо представление о том, что такое $; (первый аргумент функции разбиения) в следующем фрагменте кода:

      local(@a) = ();
      local($i) = 0;
      for ($i = 0; $i < $d; $i++) {
         @a = split($;, @b[$i]);
         $c     = @a[0];
      }

Скаляр не найден ни в каком месте скрипта, кроме как в цикле for.

Любая помощь приветствуется.

Ответы [ 2 ]

13 голосов
/ 04 февраля 2010

Специальные переменные Perl документированы в perlvar, включая $;

$ SUBSEP

$;

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

$foo{$a,$b,$c}

это действительно означает

$foo{join($;, $a, $b, $c)}

Но не ставьте

@foo{$a,$b,$c}  # a slice--note the @

что означает

($foo{$a},$foo{$b},$foo{$c})

По умолчанию "\034", так же, как SUBSEP в awk. Если ваши ключи содержат двоичные данные, безопасное значение для $; может отсутствовать. (Мнемоника: запятая (синтаксический разделитель нижних индексов) - это точка с запятой. Да, я знаю, это довольно неубедительно, но $, уже используется для чего-то более важного.)

Рассмотрите возможность использования "настоящих" многомерных массивов, как описано в perllol .

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

Обратите внимание, что @b[$i] и @a[0], вероятно, должны быть

$b[$i]

и

$a[0]

вместо этого. С ведущими @ они представляют собой одноэлементные срезы массивов, но с $ они являются простыми скалярами.

0 голосов
/ 04 февраля 2010

Специальные переменные Perl перечислены в perlvar .

...