Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> substr странное поведение lvalue, при многократном присваении 
:(
    Опции темы
MaXL
Дата 4.8.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Всем привет.
Есть код:
Код

$x = '1234';
for (substr($x,1,2)) {
    $_ = 'a'; print $x,"\n"; # prints 1a4
    $_ = 'xyz'; print $x,"\n"; # prints 1xyz4
    $x = '56789';
    $_ = 'pq'; print $x,"\n"; # prints  
}

не понятно, почему в последней строке результат будет такой "5pq9" ?
вот такой код, например
Код

#...смотри выше
$x = '56789';
print substr($x,1,2);
#...

выводит 67. А в первом варианте, после присвоения переменной $x нового значения,
переменная $_ уже становится равной 678.
На странице по приведённой мной ссылке написано:
Цитата

it remembers which part of the original string is being modified

так вот неясно, как оно такое запоминает smile


--------------------
MaXL
PM MAIL   Вверх
MaXL
Дата 21.8.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Up.
Вопрос до сих пор ещё актуален.


--------------------
MaXL
PM MAIL   Вверх
DurRandir
Дата 21.8.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1. Оно напечатает 5pq89, что более логично
2. use Devel::Peek; и расставляете Dump $_; по коду в тех местах, где интересно. Но надо хотя бы немного понимать, как перл внутри себя хранит переменные.
PM   Вверх
MaXL
Дата 21.8.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата

1. Оно напечатает 5pq89, что более логично

а вы проверьте  smile  да и ссылку я дал, не просто так.
Цитата(DurRandir @  21.8.2010,  16:53 Найти цитируемый пост)
Но надо хотя бы немного понимать, как перл внутри себя хранит переменные. 

например ?


--------------------
MaXL
PM MAIL   Вверх
DurRandir
Дата 22.8.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1. Я даже запускал. Prior to Perl version 5.9.1, the result of using an lvalue multiple times was unspecified. - у меня 5.8.8.
2. Ну, например, вот это:

Цитата

SV = PVLV(0x2833f030) at 0x28302d80
  REFCNT = 2
  FLAGS = (PADMY,GMG,SMG,pPOK)
  IV = 0
  NV = 0
+  PV = 0x283060a4 "pq"\0
+  CUR = 2
  LEN = 4
  MAGIC = 0x2832f420
    MG_VIRTUAL = &PL_vtbl_substr
+    MG_TYPE = PERL_MAGIC_substr(x)
  TYPE = x
+  TARGOFF = 1
+  TARGLEN = 2
  TARG = 0x28302ae0
  SV = PVIV(0x28305020) at 0x28302ae0
    REFCNT = 2
    FLAGS = (POK,OOK,pPOK)
+    IV = 1  (OFFSET)
+    PV = 0x283181e9 ( "1" . ) "5pq89"\0
+    CUR = 5
    LEN = 7


Помечено то, что интересно для этого случая.

Это сообщение отредактировал(а) DurRandir - 22.8.2010, 01:05
PM   Вверх
MaXL
Дата 22.8.2010, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



1. Ну отлично, раз уж вы всё таки прошли по ссылке и прочитала что там написано, то можно было легко сделать вывод, что у меня не
"Prior to Perl version 5.9.1, the result of using an lvalue multiple times was unspecified"
и как работает substr именно в версии 5.9.1+
2. я ничего не понял из приведённого листинга.

Это сообщение отредактировал(а) MaXL - 22.8.2010, 07:41


--------------------
MaXL
PM MAIL   Вверх
DurRandir
Дата 22.8.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1. Ну так запустите у себя с отладочной печатью, и увидете похожий (но другой) вывод. Но вы даже не попробовали.
2. Это и есть "надо понимать, как перл внутри себя хранит переменные".

Это сообщение отредактировал(а) DurRandir - 22.8.2010, 15:05
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.