Sysadminai sako, kad ši programa yra kreiva, o programuotojai sako, kad kreivi patys adminai. Kas iš tiesų kaltas ir kaip išspręsti šią problemą?
Server version: Apache/2.2.3 mod_perl: 2.0
Serverio konfigūracija:
Alias /perl /var/www/perl <Directory /var/www/perl> SetHandler perl-script PerlHandler ModPerl::PerlRun PerlOptions +ParseHeaders Options +ExecCGI allow from all </Directory>
Programa:
#!/usr/bin/perl
use lib q(/var/www/lib); use strict; use CGI; use Box;
my $q = CGI->new();
my $boxes = {}; my $items = {};
my $data = do { local( @ARGV, $/ ) = "/var/www/perl/data.txt" ; <> };
foreach my $it (split "\n", $data) { my ($it_lb,$it_dt,$box_lb) = ($it =~ /^item:(.*), data:(.*), box:(.*)$/); my $box = $boxes->{$box_lb}; $boxes->{$box_lb} = $box = Box->new($box_lb) unless defined $box; my $item = $items->{$it_lb} = Box::item->new($it_lb,$it_dt); $box->add_item($item); }
my $it = $q->param('item'); print $q->header(); if (exists $items->{$it} ) { print "item: '$it' in: '".$items->{$it}->in_box(), "' box\n"; } else { print "there is no such item: '$_'\n"; } -------------------------------------------
Programerio biblioteka :) : package Box;
sub new { my ($proto,$label) = @_; my $self = { label => $label, items => [] }; bless ($self,ref($proto) || $proto); return $self; } sub add_item { my ($self,$item) = @_; push @{$self->{items}}, $item; $item->{box} = $self; }
package Box::item; sub new { my ($proto,$label,$data) = @_; my $self = { box => undef, label => $label, data => $data }; bless ($self,ref($proto) || $proto); return $self; } sub in_box { my ($self) = @_; return $self->{box}->{label}; } 1;
Taškai: Teisingas atsakymas - 90 taškų. Pirmasis teisingai atsakęs gauna papildomus 20 taškų.
Teisingas atsakymas:
Problemos esmė - nuoroda (reference) į programoje sukurtą objektą panaikinama bei atmintis atlaisvinama tik tada, kai objektas yra nenaudojamas, t.y., nelieka jokių nuorodų į jį. Tuo tarpu, kai yra du objektai, kurie abu rodo vienas kitą, nuorodos nepanaikinamos. Todėl Perl šiukšlių rinktuvas (garbage collector) neatlaisvina atminties. Kai programa veikia, naudojant fast-cgi (mod-perl), taip sunaudojama visa laisva serverio atmintis.
...Tačiau vienas dalyvis atsakė štai taip: Atsakymas: Programuotojai
...ir štai taip pagrindė savo atsakymą: Vyrai, nesikankinsiu aš čia narpliodamas kažką. Manau, kad klaidą padarė programuotojai, nes šiandien/ryt švenčiam administratorių dieną ir būtų nelogiška kaltinti adminus per šventes, plius žinant kaip adminai nekenčia programerių, kurie pastoviai zirzia ir verkia.
|
|