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


Автор: MaXL 4.8.2010, 18:29
Всем привет.
Есть http://perldoc.perl.org/functions/substr.html:
Код

$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 21.8.2010, 12:35
Up.
Вопрос до сих пор ещё актуален.

Автор: DurRandir 21.8.2010, 16:53
1. Оно напечатает 5pq89, что более логично
2. use Devel::Peek; и расставляете Dump $_; по коду в тех местах, где интересно. Но надо хотя бы немного понимать, как перл внутри себя хранит переменные.

Автор: MaXL 21.8.2010, 21:25
Цитата

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

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

например ?

Автор: DurRandir 22.8.2010, 01:00
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


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

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

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

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