2016-04-23 12 views
1

Моя проблема такая же, как в упомянутом в this ответе. Я пытался понять код, и это то, что я узнал:Проблемы с установкой сервера Darwin Streaming os x

Это происходит сбой в файле parse_xml.cgi, пытается получить сообщения (return $message{$name}) из файла с именем сообщения (расположенные в html_en). Значение $ сообщения происходит от метода GetMessageHash в файле adminprotocol-lib.pl:

sub GetMessageHash 
{ 
    return $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} 
} 

$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} устанавливается в файле streamingadminserver.pl:

$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"} 

Я не знаю, что-нибудь о Perl, поэтому я понятия не имею, что может быть проблемой, потому что то, что я увидел $messages{"en"} имеет правильное значение (если я делаю print($messages{"en"}{'SunStr'} Получаю значение «Солнце»)).

Однако, если я попытаюсь сделать print($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}{'SunStr'}, я ничего не получаю. Кажется, как $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} не установлен

Я попробовал этот простой пример и он работал отлично:

$ENV{"HELLO"} = "hello"; 
print($ENV{"HELLO"}); 

и она отлично работает, печатает «привет».

Любая идея о том, что может быть проблемой?

+0

Darwin Streaming Server функционально устарели. С 2007 года новых выпусков не было! Я бы не стал использовать его для каких-либо новых проектов. – duskwuff

+0

Вы правы, мне все еще нужно попробовать, потому что я не нашел много вариантов для того, что мне нужно (сервер с открытым исходным кодом, способный передавать поток mp4 через RTSP). Если бы я хотел использовать его, мне нужно было бы адаптировать некоторые вещи (и посвятить некоторое время изучению Perl), поэтому я думаю, что буду продолжать искать. – venito

ответ

0

Похоже $messages{"en"} является HashRef: указатель на какой-то адрес памяти, держащего ключ-значение-магазин. Можно даже напечатать соответствующий адрес памяти:

perl -le 'my $hashref = {}; print $hashref;' 
HASH(0x1548e78) 

0x1548e78 это адрес, но она действует только в пределах одного запущенного процесса. Повторно запустите команду образца, и вы будете получать разные адреса каждый раз.

HASH (0x1548e78) также является просто понятным для человека представлением реальной сохраненной ценности. Установка $hashref2="HASH(0x1548e78)"; не создаст реальной ссылки, а будет просто копией удобочитаемой строки.

Вы можете легко доказать эту теорию, используя print $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} в обоих сценариях.

Data::Dumper обычно используется, чтобы показать содержимое ссылочного хэш (местоположение памяти):

use Data::Dumper; 
print Dumper($messages{"en"}); 
# or 
print Dumper($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}); 

Это также покажет, если указатель/ссылка может разыменовываться в обоих сценариях.

Решение вашей проблемы, вероятно, передавая значение вместо HashRef:

$ENV{"QTSSADMINSERVER_EN_SUN"} = $messages{"en"}->{SunStr}; 

Лучшая практика использует -> между двумя ключами. «Или» котировки для ключа также optional if the key is a plain word.

Но прохождение всего через переменные среды кажется неправильным. Возможно, они не смогут хранить ссылки на OSX (я не знаю). Возможно, вы захотите извлечь хранилище строк в файл include и загрузить его через require.

См. http://www.perlmaven.com/ или http://learn.perl.org для получения дополнительной информации о Perl.

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

  • Нет связанных вопросов^_^