perl: кочки и ухабы
Jun. 25th, 2009 12:04 pm
# perl -le 'sub a () { my $ret = "scalar A"; $ret->{'a'} = "hash A"; return $ret };
print a (); print a ()->{'a'};'
scalar A
hash A
удобное, но относительно опасное средство для возвращения параметров.
более интересно (для программистов):
# perl -le 'package Main;
sub a { my $ret = ""; $ret->{'a'} = "hash A"; return $ret };
sub b { my $ret = ""; $ret->{'a'} = "hash B"; return $ret };
package main;
my $a = Main->a(); my $b = Main->b();
print "Hash A: ",$a->{'a'};
print "Hash B: ",$b->{'a'};'
Hash A: hash B
Hash B: hash B
#
описания данного поведения каk feature не нашел.
no subject
Date: 2009-06-25 09:41 am (UTC)Hash A: hash BHash B: hash B
Фича? Да это диверсия!
no subject
Date: 2009-06-25 09:48 am (UTC)no subject
Date: 2009-06-25 09:54 am (UTC)no subject
Date: 2009-06-25 09:58 am (UTC)use strict;?no subject
Date: 2009-06-25 10:08 am (UTC)no subject
Date: 2009-06-25 10:32 am (UTC)no subject
Date: 2009-06-25 10:38 am (UTC)use strict;вываливается сCan't use string ("") as a HASH ref while "strict refs" in use at -e line 1.:)no subject
Date: 2009-06-25 02:02 pm (UTC)#!/usr/bin/perl
sub test1 () {
my $ret = 'level 11';
$$ret = 'level 21';
$$$ret = 'level 31';
return $ret;
}
sub test2 () {
my $ret = 'level 12';
$$ret = 'level 22';
$$$ret = 'level 32';
return $ret;
}
my $ref1 = test1();
my $ref2 = test2();
print $ref1,' ',$ref2, $/;
print $$ref1,' ',$$ref2, $/;
print $$$ref1,' ',$$$ref2, $/;
level 11 level 12
level 21 level 22
level 31 level 32
no subject
Date: 2009-06-26 06:14 am (UTC)Искусство управления памятью в Perl
Date: 2009-06-25 07:11 pm (UTC)sub somesub { my $x = 0; $x->{'key'} = "somesub: Hash key"; $x->[0] = "somesub: Array 0"; $x } sub anothersub { # To stop dealing with garbage # simply assign $y to a value different from $x, e.g.: 0.1 my $y = 0.0; $y->{'key'} = "anothersub: Hash key"; $y->[0] = "anothersub: Array 0"; $y } local $, = "\n"; print somesub(), somesub()->{'key'}, somesub()->[0], anothersub(), anothersub()->{'key'}, anothersub()->[0];Ничего, прикольный такой фокус-покус. А как или где нарыли, если не секрет?
Re: Искусство управления памятью в Perl
Date: 2009-06-25 07:56 pm (UTC)sub SomeClass { my $instance = undef if undef; return $instance if defined $instance; require SomeClass; SomeClass->import(); $instance = SomeClass->new(); }Re: Искусство управления памятью в Perl
Date: 2009-06-26 06:19 am (UTC)Re: Искусство управления памятью в Perl
Date: 2009-06-26 05:45 pm (UTC)Re: Искусство управления памятью в Perl
Date: 2009-06-26 08:17 am (UTC)Re: Искусство управления памятью в Perl
Date: 2009-06-26 07:11 pm (UTC)1). Для каждой лексической переменной память выделяется на этапе компиляции OP-кода, а не в процессе его выполнения.
2). К моменту возвращения из scope к которому относится лексическая переменная, выделенная ей память не высвобождается, если только не потребовать этого явным образом: undef($somevar)
3). Объем памяти, ассоциированный с лексической переменной, прямопропорционален самой объемной структуре данных, которая когда-либо этой переменной присваивалась.
4). Фактически, лексическая переменная - это указатель на внутренние структуры данных Perl, соотносящиеся с основными типами данных языка, и поэтому одновременно может одновременно "содержать" несколько значений, например: целое число, число с плавающей точкой, строка, массив, хэш и пр.
5). На основании предложенного кода, рискну выссказать предположение, что Perl каким-то образом хэширует отдельно-взятые поля данных независимо от их принадлежности конкретным лексическим переменным.
Re: Искусство управления памятью в Perl
Date: 2009-06-26 06:17 am (UTC)иногда попадаются приятные задачки.