[ karas @ 20.09.2005. 09:23 ] @
Primer iz knjige koji pokazuje upotrebu promenljivih prosledjenih modulu ne radi. Naime, u Cocoa.pm imam

Code:

#! /usr/bin/perl

package Cocoa;

sub new
{
  my $type = shift;
  my %parm = @_;
  my $this = {};
  $this->{'Name'} = $parm{'Name'};
  $this->{'x'} = $parm{'x'};
  $this->{'y'} = $parm{'y'};
  bless $this, $type;  
}

1;


a u test.pl imam

Code:

#!/usr/bin/perl

push (@INC,'pwd');
use Cocoa;
$mug = Cocoa::new('Name'=>'top', 'x'=>10, 'y'=>20);
print "Name=$mug->{'Name'}\n";
print "x=$mug->{'x'}\n";
print "y=$mug->{'y'}\n";


Medjutim, ne ispisuje vrednosti promenljivih Name, x i y, kao da nisu ni definisane. U chemu je problem?

[ alex @ 20.09.2005. 12:07 ] @
Prvo sto sam uocio je problem u dodavanju tekuceg direktorijuma u @INC - koristi tzv. backticks a ne ticks, jer se u tvom primeru umesto izvrsavanja komande pwd i dodavanja tekuceg direktorijuma u @INC tebi dodaje string pwd.


Primer pravilne upotrebe:
Code:

push (@INC,`pwd`);


[Ovu poruku je menjao alex dana 20.09.2005. u 13:13 GMT+1]
[ karas @ 21.09.2005. 08:43 ] @
I dalje necce, i mislim da to nema veze sa navodnicima.
Ne razumem shta se deshava sa this, kao da gubim njegovu vrednost po izlasku iz konstruktora. Naime, ako u Person.pm imam

Code:

#! /usr/bin/perl

package Person;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(myprint);

sub new
{
  my $type = shift;
  my $this = {};
  $this->{'Name'} = $_[0];
  $this->{'Surname'} = $_[1];
  bless $this, $type;

  print ("Name = ", $this->{'Name'}, "\n"); # (1)
  print ("Surname = ", $this->{'Surname'}, "\n\n");# (2)

  return $this;
}

sub myprint
{
}

1;


a u test.pl

Code:

#!/usr/bin/perl

push (@INC, 'pwd');
use Person;

$p1 = new Person("Pera", "Peric");
$p2 = new Person("Laza", "Lazic");
$p1->myprint;
$p2->myprint;


onda je sve u redu. Ali ako linije (1) i (2) prebacim iz new u myprint onda se ne ispisuju vrednosti za Peru i Lazu.
Zashto?

[Ovu poruku je menjao karas dana 21.09.2005. u 10:45 GMT+1]

[Ovu poruku je menjao karas dana 21.09.2005. u 10:57 GMT+1]
[ bzero @ 21.09.2005. 09:46 ] @
Problem je ovde:

Code:

$mug = Cocoa::new('Name'=>'top', 'x'=>10, 'y'=>20);


ne moze tako da se napravi novi objekat, nego treba da bude:

Code:

$mug = new Cocoa('Name'=>'top', 'x'=>10, 'y'=>20);


ili

Code:

$mug = Cocoa->new('Name'=>'top', 'x'=>10, 'y'=>20);


Inace uvek stavljaj -w (#!/usr/bin/perl -w), bice ti mnogo lakse da otkrijes greske.
[ bzero @ 21.09.2005. 09:57 ] @
Ako u funkciju myprint stavis:

Code:

sub myprint
{
 print ("Name = ", $this->{'Name'}, "\n"); # (1)
  print ("Surname = ", $this->{'Surname'}, "\n\n");# (2)
}


onda naravno nece raditi. Treba da bude ovako:

Code:

sub myprint {
    my $class = shift;
    
    print ("Name = ", $class->{'Name'}, "\n"); # (1)
    print ("Surname = ", $class->{'Surname'}, "\n\n");# (2)
}


Obavezno procitaj Tom's object-oriented tutorial for perl:
http://www.sunsite.ualberta.ca...erl-5.005_03/pod/perltoot.html

ili ako si na unix-u:
man perltoot
[ karas @ 21.09.2005. 09:59 ] @
Hvala, sada sve radi. Moram brzo da nauchim Perl, koristim Teach yourself Perl in 21 days, ali poglavlje o modulima nije najbolje objashnjeno. Prvi primer je bash iz knjige.
Hvala josh jednom.



[Ovu poruku je menjao karas dana 21.09.2005. u 11:06 GMT+1]
[ techcode @ 23.09.2005. 00:32 ] @
Trebalo bi da ima TOOT (man perltoot ili potrazi HTML verziju) u Perl distribuciji koji to objasnjava veoma lepo ...
[ karas @ 23.09.2005. 07:57 ] @
Ima tutorijal, ali rekoh kad vecc imam knjigu da radim po njoj, trebalo bi da bude brzze. Bicce da autor nije proveravao svako parche koda.
[ techcode @ 23.09.2005. 10:32 ] @
A to sto ja nisam video da je sve to pomenuto u jenom od predhodnih postova je vec neka druga stvar ...

U svakom slucaju, TOOT je strava. A imas i par knjiga na tu temu. Ja sam ih gomilu pronasao na Shareaza (gnutela2) mrezi. Pojavile su se i ove nove (izdanje 2005) Perl Testing - Developers handbook, Learning Perl 4th edition, Advanced Perl programming 2nd edition ...itd.

Jedina knjiga koja ima kod nas da se kupi u izdanju Kompjuter Biblioteke (kosta ~ 432 din sada na popustu) je Perl - The complete reference. I nije bas nesto :(
[ karas @ 23.09.2005. 15:43 ] @
Ne nameravam da se previshe bavim Perlom, stari kod treba menjati, a nadam se da ccu ga uskoro prebaciti u C++.
[ techcode @ 23.09.2005. 18:41 ] @
A sta ta aplikacija uopste radi?

Generalno - da bi se kod iz Perl-a "prebacio" u C/C++ treba puno vremena. Tacnije obicno ti je potrebno mnogo vise koda. I to ne racunajuci slucajeve kada se koriste CPAN moduli/klase - a ne postoji nista slicno za C/C++.

Moja preporuka (kao neko ko je radio i sa C/C++ izmedju ostalih) je da se jos malo pozabavis Perl-om. Prosto je neverovatno koliko se u njemu brzo radi i uopste kakve je sve stvari moguce uraditi - o kojima kada C++ koristis mozes samo da sanjas.

Naravno - ne kazem da je Perl uvek bolji izbor od Cpp-a - narocito ako su potrebne neke lowlevel stvari ili je brzina jednostavno presudna (number crunching). Ali posto ti vec imas Perl kod ... to verovatno nije tako.

Evo i preporuke :

Knjige (ima ih online :) :

O'Reilly - Perl Best Practices [2005]
Addison Wesley - Effective Perl Programming, Writing Better Programs with Perl [1997]
Addison Wesley - Perl Medic, Transforming Legacy Code [2004]

Free as in beer :) :

Picking up perl (PDF) - http://ebb.org/PickingUpPerl/
Learning Perl the Hard Way (PDF) - http://greenteapress.com/perl/
Impatient Perl (PDF) - http://www.greglondon.com
http://www.perltraining.com.au/notes.html na kojem se mogu pronaci :
- Introduction To Perl (pdf)
- Intermediate Perl (pdf)
- Object Oriented Perl (pdf)
- Database Programming with Perl (pdf)
- Perl Security (pdf)

PS. Sve ovo bi bilo dobro dodati i u TOP temu ...
[ karas @ 26.09.2005. 08:09 ] @
Hvala na savetima, ali ne pitam se ja, moje je da to uradim. Poshto cce se sistem shiriti, bolje je odmah sve prebaciti u C++.