promenna predana odkazem
Honza Pazdziora
adelton na informatics.muni.cz
Pátek Listopad 1 14:33:30 MET 2002
On Fri, Nov 01, 2002 at 02:25:53PM +0100, Jiri Polcar wrote:
>
> chtel bych napsat fci, ktera prijima jako parametr jeden skalar a to
> bud jeho hodnotu, nebo odkaz na nej.
>
> fce( $parametr ) NEBO fce( \$parametr )
>
> Fce by mela pracovat nezavisle na zpusobu predani parametru. Dal jsem do
> hromady neco takoveho:
>
> sub fce {
>
> use vars qw( $input $scalar_input );
>
> $input = shift;
>
> if ( ref( $input ) eq 'SCALAR' ) {
> $scalar_input = ${$input};
> } else {
> *scalar_input = *input;
> }
>
> # vlastni telo fce ( pracuje ze $scalar_input )
> print $scalar_input;
>
> }
>
> Hlavni duvod, proc chci predavat odkaz je usetreni pameti. Muj dotaz
> zni: usetrim timto zpusobem zkutecne? Tedy, bude obsah skalarni promenne
> v pameti skutecne pouze jednou?
Jedna vec je, ze zcela jiste nechcete jako $input a $scalar_input
pouzival globalni promenne, ale lokalni promenne. Cili my, zadne use
vars. Kdyz uz byste chtel globalni promenne, bylo by vhodne je
lokalizovat pomoci local.
Promenne jsou v Perlu predavany odkazem. Cili pokud budete pouzivat
$_[0], tak se dostanete na tu promennou, ktera byla predana odkazem,
a je-li to lvalue, muzete ji i menit. Cili mozna by Vam stacilo pouzit
tohle.
A ted k tomu kodu: $input = shift zkopiruje do $input hodnotu $_[0].
Cili tady jste vyrobil prvni kopii. V pripade, ze ten test na ref
uspeje, tak do $scalar_input kopirujete dereferencovanou hodnotu, cili
delate dalsi kopirovani. V pripade, ze nejde o ref, tak delate alias,
ale stejne uz jste tu hodnotu do $input kopiroval, cili o nic nejde.
Takze bych odpovedel, ze timto zpusobem pamet neusetrite.
--
------------------------------------------------------------------------
Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
... all of these signs saying sorry but we're closed ...
------------------------------------------------------------------------
Další informace o konferenci Perl