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