Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Разыменнование скаляров


Автор: s_a_s_h_a 6.9.2004, 15:48
Случилась такая трабла: мне надо передать функции, например, следующий параметр

картинка1 текст1 картинка2 текст2 (причем картинка - уже результат работы другой функции и
является ссылкой на скаляр).

Передать одну картинку и обработать не проблема, а трабла вот в чем передаю строку
"SCALAR(0x81a3bc4) str1 SCALAR(0x81a3bf4) str2"
регулярными вырыжениями вычленяю SCALAR(....) и пытаюсь их разыменовать. У меня ничего
не получается. Вопрос: если ссылки на скаляр объединяются со строками, то потом из них уже ничего
не получить?

Автор: ElectricalStorm 6.9.2004, 16:06
Разименовать скаляр очень просто

Код

$scalar = 1;

$scalar_ref = \$scalar;

$scalar_new = $$scalar_ref;

Автор: s_a_s_h_a 6.9.2004, 16:07
А что такое 1?

Автор: ElectricalStorm 6.9.2004, 16:07
число smile.gif

Автор: s_a_s_h_a 6.9.2004, 16:08
А почему не 2? smile.gif
Добавлено @ 16:11
Понял. Это был глобальный пример. Но у меня тяжелый случай у меня не просто ссылка на скаляр, а строка содержащая ссылки на скаляры и символы. Вот.
Добавлено @ 16:16
my $str="SCALAR(0x81a3bc4) lalala SCALAR(0x81a3bf4) tytyty";

my @mas=($str =~ /(SCALAR\(0x[0-9a-f]+\))/g);

for my $i (@mas)
{
print "${$i}\n";
print "$$i\n";
}

не проходит.

Автор: ElectricalStorm 6.9.2004, 16:16
ок ща

Автор: s_a_s_h_a 6.9.2004, 16:18
Уже

Автор: dimes 6.9.2004, 16:38
2s_a_s_h_a
не обижайся но это большой изврат!
может конечно ты делаеш из спортивного интереса smile.gif
но почемубы сразу не передовать разыменоваными?

далее возможно я ошибаюсь но ты стал жертвой молчаливых изменений типов в perl
например:
@q=qw(q w e);
print (1+@q);# будет 4
Коментарии нужны?

твой пример:

$q=1;
$w=\$q; # Ссылка на скаляр
print $w;# SCALAR(0x155f098) например
print ref($w);# SCALAR все ok
print $$w;# 1 все правильно

$e="$w";# Вот проблемма $w развернется как строка и как строка будет закинута в $e
print $e;# SCALAR(0x155f098) но это уже не ссылка а просто строка
print ref($e);# "" пустота все верно строка не является ссылкой smile.gif
print $$e;# "" что и требовалось доказать smile.gif

Автор: s_a_s_h_a 6.9.2004, 16:48
Если пойму, почему я так делаю, то напишу.

Автор: ElectricalStorm 6.9.2004, 17:00
я подумал может получиться от евалить его ... не получиллось... sad.gif

Автор: s_a_s_h_a 6.9.2004, 17:03
Наверное вот почему. Чтобы вставить картинку в ртф-документ надо ее запихать в
{\pict ... }, а в тексте надо все {,} и \ заменять на \'7b,\'7d и \'5c. Вот. И чтобы
различать где строка, а где картинка, я запихивал картинку в скаляр, а теперь потребовалось
(не мне), чтобы было то что было, написано вверху, и как раньше не проходит.

Автор: korob2001 6.9.2004, 17:10
s_a_s_h_a вам обсолютно верно пояснил dimes
Вот вам простейший тест:
Код

#!/usr/bin/perl -w
use strict;
my $r1 = \100;
my $r2 = \200;

my $ref_to_string = "$r1:$r2";

# Разобъём строку.
my( $ref1, $ref2 ) = split(':', $ref_to_string);

# Проверим содержимое переменных
foreach ( $ref1, $ref2 ) {
              if ( ref( $ref1 ) ) {
                   print "Ссылка\n";
              } else {
                   print "Не ссылка\n";
              }
}

Удачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)