2013-07-28 3 views
2

меня arraytest.pm с нижеДоступ глобальный массив из файла модуля Perl

package arraytest; 

our @myarray = {"1", "2", "3", "4"}; 

и я пытаюсь получить значения из другого скрипта PERL

use arraytest; 

foreach (@arraytest::myarray) { 
    print "$arraytest::myarray\n"; 
} 

Я ничего не получить распечатанный и ошибок нет. Просьба сообщить мне, если ссылка на массив верна?

Заранее спасибо

+0

'использование предупреждений;', чтобы получить больше ошибок для печати – mob

ответ

0

Вы пытаетесь достичь что-то вроде:

use 5.012; 
use warnings; 

package MyArr; 
our @arr = (1..10); 

package main; 
for (@MyArr::arr) { 
    say "$_"; 
} 

#or like above with a helper variable 
for my $val (@MyArr::arr) { 
    say "$val"; 
} 

Ps: выше, как правило, не является хорошей практикой. Вместо этого используйте объекты.

Редактировать - @ комментарий Дэйва

use 5.012; 
use warnings; 

package MyArr { 
    our @arr = (1..10); 
} 

package main { 
    for (@MyArr::arr) { 
     say "$_"; 
    } 

    for my $val (@MyArr::arr) { 
     say "$val"; 
    } 
} 
+0

Спасибо за ввод и информацию об объекте. – user2628187

+1

Поскольку 'наш' имеет лексический эффект, вам не нужно использовать полное имя (' @MyArr :: arr') в любой из ваших циклов 'for'. Переключение с 'package MyArr' на' package main' не создает новую лексическую область. Чтобы принудительно потребовать полное имя (это то, что вы пытаетесь продемонстрировать здесь), вам нужно поставить голый блок вокруг двух строк пакета MyArr. –

+0

@DaveCross конечно, youre правый. Но ОП запрашивает «другой скрипт perl». Конечно, я могу написать два примера файла: один для пакета MyArr и второй файл для основного и требует MyArr из основного - но это не было основной точкой вопроса ... (imho) – jm666

5

Yer синтаксис массива неправильно.

У Perl нет литералов массива. Он имеет

  • Списки: ссылки 1, 2, 3, 4
  • массива литералы: [1, 2, 3, 4]
  • Хэш ссылки литералы: {1 => 2, 3 => 4}.

Хеши и массивы могут быть инициализированы путем назначения списков.

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

my %hash = (1 => 2, 3 => 4); 
our @myarray = (\%hash); 

Что ты имел в виду, чтобы сделать было

our @myarray = (1, 2, 3, 4); # parens needed because of precedence 

или

our @myarray = 1 .. 4; 

О, и, пожалуйста, не используйте имена в нижнем регистре для ваших пакетов. Они зарезервированы для прагматических модулей, которые влияют на компиляцию, например strict или feature.

+0

Спасибо за ваше предложение о присвоении пакетов и фигурные скобки.Теперь я работаю. – user2628187

3

Всегда используйте

use strict; 
use warnings; 

Проблема заключается в том, что вы пытаетесь написать содержание $arraytest::myarray переменной, которая не существует вообще. Попробуйте следующее:

foreach my $val (@arraytest::myarray) { 
    print "$val\n"; 
} 

, а также ваш массив не содержит того, что вы ожидаете. У вас есть hash ref в первой ячейке массива. Вы должны использовать:

our @myarray = ("1", "2", "3", "4"); 
+0

Спасибо за ваш ответ. Я пробовал это, но я получаю хэш-вывод вместо элементов массива HASH (0x4f8360) – user2628187

+0

@ user2628187 Это потому, что вы инициализируете свой массив, чтобы кодировать хеш-ссылку (см. Мой ответ для деталей). Вы получаете такой вывод, когда вы печатаете hashref. Последний фрагмент в ответе Гинека-Пичи-Выходила показывает, как правильно инициализировать массив (используйте парсеры, а не скобки). – amon

+0

Извините, это была моя ошибка .. использовал {"1", "2", "3", "4"}; вместо этого, если («1», «2», «3», «4»); ... Он работал благодаря большому количеству – user2628187

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