/
usr
/
local
/
share
/
man
/
man3
/
/usr/local/share/man/man3
mkdir
upload
Name
Size
Mode
Actions
App::Prove.3pm
10508
0444
edit
dl
rm
App::Prove::State.3pm
6005
0444
edit
dl
rm
App::Prove::State::Result.3pm
5619
0444
edit
dl
rm
App::Prove::State::Result::Test.3pm
5051
0444
edit
dl
rm
AppConfig.3pm
35289
0444
edit
dl
rm
AppConfig::Args.3pm
7992
0444
edit
dl
rm
AppConfig::CGI.3pm
6609
0444
edit
dl
rm
AppConfig::File.3pm
12614
0444
edit
dl
rm
AppConfig::Getopt.3pm
7444
0444
edit
dl
rm
AppConfig::State.3pm
24972
0444
edit
dl
rm
AppConfig::Sys.3pm
6695
0444
edit
dl
rm
Archive::Tar.3pm
44061
0444
edit
dl
rm
Archive::Tar::File.3pm
11083
0444
edit
dl
rm
Archive::Zip.3pm
69985
0444
edit
dl
rm
Archive::Zip::FAQ.3pm
18437
0444
edit
dl
rm
Archive::Zip::MemberRead.3pm
6734
0444
edit
dl
rm
Archive::Zip::Tree.3pm
2875
0444
edit
dl
rm
B::COW.3pm
5163
0444
edit
dl
rm
Canary::Stability.3pm
3727
0444
edit
dl
rm
CDB_File.3pm
14318
0444
edit
dl
rm
common::sense.3pm
0
0444
edit
dl
rm
Compress::Raw::Bzip2.3pm
13463
0444
edit
dl
rm
Compress::Raw::Zlib.3pm
42082
0444
edit
dl
rm
Compress::Zlib.3pm
38719
0444
edit
dl
rm
CPAN::Meta.3pm
15923
0444
edit
dl
rm
CPAN::Meta::Converter.3pm
6594
0444
edit
dl
rm
CPAN::Meta::Feature.3pm
4322
0444
edit
dl
rm
CPAN::Meta::History.3pm
7855
0444
edit
dl
rm
CPAN::Meta::History::Meta_1_0.3pm
9973
0444
edit
dl
rm
CPAN::Meta::History::Meta_1_1.3pm
12410
0444
edit
dl
rm
CPAN::Meta::History::Meta_1_2.3pm
22224
0444
edit
dl
rm
CPAN::Meta::History::Meta_1_3.3pm
23974
0444
edit
dl
rm
CPAN::Meta::History::Meta_1_4.3pm
24565
0444
edit
dl
rm
CPAN::Meta::Merge.3pm
5285
0444
edit
dl
rm
CPAN::Meta::Prereqs.3pm
7380
0444
edit
dl
rm
CPAN::Meta::Requirements.3pm
12308
0444
edit
dl
rm
CPAN::Meta::Spec.3pm
45592
0444
edit
dl
rm
CPAN::Meta::Validator.3pm
4215
0444
edit
dl
rm
CPAN::Meta::YAML.3pm
4230
0444
edit
dl
rm
Crypt::OpenSSL::Random.3pm
5634
0444
edit
dl
rm
Curses.3pm
37580
0444
edit
dl
rm
Curses::UI.3pm
15619
0444
edit
dl
rm
Curses::UI::Buttonbox.3pm
8908
0444
edit
dl
rm
Curses::UI::Calendar.3pm
8203
0444
edit
dl
rm
Curses::UI::Checkbox.3pm
6509
0444
edit
dl
rm
Curses::UI::Color.3pm
5903
0444
edit
dl
rm
Curses::UI::Common.3pm
6498
0444
edit
dl
rm
Curses::UI::Container.3pm
9041
0444
edit
dl
rm
Curses::UI::Dialog::Basic.3pm
5213
0444
edit
dl
rm
Curses::UI::Dialog::Calendar.3pm
4761
0444
edit
dl
rm
Curses::UI::Dialog::Dirbrowser.3pm
5369
0444
edit
dl
rm
Curses::UI::Dialog::Error.3pm
4307
0444
edit
dl
rm
Curses::UI::Dialog::Filebrowser.3pm
6889
0444
edit
dl
rm
Curses::UI::Dialog::Progress.3pm
5774
0444
edit
dl
rm
Curses::UI::Dialog::Question.3pm
5277
0444
edit
dl
rm
Curses::UI::Dialog::Status.3pm
4765
0444
edit
dl
rm
Curses::UI::Label.3pm
7333
0444
edit
dl
rm
Curses::UI::Listbox.3pm
11988
0444
edit
dl
rm
Curses::UI::Menubar.3pm
8110
0444
edit
dl
rm
Curses::UI::Notebook.3pm
9140
0444
edit
dl
rm
Curses::UI::PasswordEntry.3pm
3743
0444
edit
dl
rm
Curses::UI::Popupmenu.3pm
7431
0444
edit
dl
rm
Curses::UI::Progressbar.3pm
5891
0444
edit
dl
rm
Curses::UI::Radiobuttonbox.3pm
4069
0444
edit
dl
rm
Curses::UI::Searchable.3pm
6668
0444
edit
dl
rm
Curses::UI::TextEditor.3pm
14171
0444
edit
dl
rm
Curses::UI::TextEntry.3pm
3623
0444
edit
dl
rm
Curses::UI::TextViewer.3pm
3670
0444
edit
dl
rm
Curses::UI::Tutorial.3pm
8555
0444
edit
dl
rm
Curses::UI::Widget.3pm
25675
0444
edit
dl
rm
Curses::UI::Window.3pm
5084
0444
edit
dl
rm
Cwd.3pm
7183
0444
edit
dl
rm
Date::Format.3pm
7291
0444
edit
dl
rm
Date::Language.3pm
3809
0444
edit
dl
rm
Date::Language::Bulgarian.3pm
3675
0444
edit
dl
rm
Date::Language::Hungarian.3pm
3091
0444
edit
dl
rm
Date::Parse.3pm
5402
0444
edit
dl
rm
Digest::SHA.3pm
25759
0444
edit
dl
rm
Expect.3pm
60229
0444
edit
dl
rm
ExtUtils::CBuilder.3pm
11923
0444
edit
dl
rm
ExtUtils::CBuilder::Platform::Windows.3pm
3117
0444
edit
dl
rm
ExtUtils::Command.3pm
5942
0444
edit
dl
rm
ExtUtils::Command::MM.3pm
5723
0444
edit
dl
rm
ExtUtils::Liblist.3pm
12679
0444
edit
dl
rm
ExtUtils::MakeMaker.3pm
79357
0444
edit
dl
rm
ExtUtils::MakeMaker::Config.3pm
2587
0444
edit
dl
rm
ExtUtils::MakeMaker::FAQ.3pm
26829
0444
edit
dl
rm
ExtUtils::MakeMaker::Locale.3pm
11168
0444
edit
dl
rm
ExtUtils::MakeMaker::Tutorial.3pm
8389
0444
edit
dl
rm
ExtUtils::Manifest.3pm
11961
0444
edit
dl
rm
ExtUtils::Mkbootstrap.3pm
3459
0444
edit
dl
rm
ExtUtils::Mksymlists.3pm
6699
0444
edit
dl
rm
ExtUtils::MM.3pm
2829
0444
edit
dl
rm
ExtUtils::MM_AIX.3pm
3044
0444
edit
dl
rm
ExtUtils::MM_Any.3pm
31129
0444
edit
dl
rm
ExtUtils::MM_BeOS.3pm
2798
0444
edit
dl
rm
ExtUtils::MM_Cygwin.3pm
3569
0444
edit
dl
rm
ExtUtils::MM_Darwin.3pm
2688
0444
edit
dl
rm
ExtUtils::MM_DOS.3pm
3021
0444
edit
dl
rm
ExtUtils::MM_MacOS.3pm
2987
0444
edit
dl
rm
ExtUtils::MM_NW5.3pm
3200
0444
edit
dl
rm
ExtUtils::MM_OS2.3pm
2886
0444
edit
dl
rm
ExtUtils::MM_QNX.3pm
2942
0444
edit
dl
rm
ExtUtils::MM_Unix.3pm
21419
0444
edit
dl
rm
ExtUtils::MM_UWIN.3pm
3051
0444
edit
dl
rm
ExtUtils::MM_VMS.3pm
14900
0444
edit
dl
rm
ExtUtils::MM_VOS.3pm
2926
0444
edit
dl
rm
ExtUtils::MM_Win32.3pm
5919
0444
edit
dl
rm
ExtUtils::MM_Win95.3pm
3276
0444
edit
dl
rm
ExtUtils::MY.3pm
2764
0444
edit
dl
rm
ExtUtils::testlib.3pm
2690
0444
edit
dl
rm
File::GlobMapper.3pm
11447
0444
edit
dl
rm
File::HomeDir.3pm
18212
0444
edit
dl
rm
File::HomeDir::Darwin.3pm
3232
0444
edit
dl
rm
File::HomeDir::Darwin::Carbon.3pm
3517
0444
edit
dl
rm
File::HomeDir::Darwin::Cocoa.3pm
3446
0444
edit
dl
rm
File::HomeDir::Driver.3pm
3101
0444
edit
dl
rm
File::HomeDir::FreeDesktop.3pm
3487
0444
edit
dl
rm
File::HomeDir::MacOS9.3pm
3499
0444
edit
dl
rm
File::HomeDir::Test.3pm
3534
0444
edit
dl
rm
File::HomeDir::Unix.3pm
3638
0444
edit
dl
rm
File::HomeDir::Windows.3pm
4891
0444
edit
dl
rm
File::Path.3pm
31030
0444
edit
dl
rm
File::Slurp.3pm
23626
0444
edit
dl
rm
File::Spec.3pm
13784
0444
edit
dl
rm
File::Spec::AmigaOS.3pm
2826
0444
edit
dl
rm
File::Spec::Cygwin.3pm
3957
0444
edit
dl
rm
File::Spec::Epoc.3pm
3251
0444
edit
dl
rm
File::Spec::Functions.3pm
3799
0444
edit
dl
rm
File::Spec::Mac.3pm
18664
0444
edit
dl
rm
File::Spec::OS2.3pm
3118
0444
edit
dl
rm
File::Spec::Unix.3pm
9837
0444
edit
dl
rm
File::Spec::VMS.3pm
6389
0444
edit
dl
rm
File::Spec::Win32.3pm
6451
0444
edit
dl
rm
File::Temp.3pm
36799
0444
edit
dl
rm
File::Which.3pm
9746
0444
edit
dl
rm
Getopt::Long.3pm
52647
0444
edit
dl
rm
HDB.3pm
10947
0444
edit
dl
rm
HDB::CMDS.3pm
18894
0444
edit
dl
rm
HDB::Encode.3pm
7863
0444
edit
dl
rm
HDB::Object.3pm
10057
0444
edit
dl
rm
HTML::AsSubs.3pm
8586
0444
edit
dl
rm
HTML::Element.3pm
70793
0444
edit
dl
rm
HTML::Element::traverse.3pm
15984
0444
edit
dl
rm
HTML::Form.3pm
28158
0444
edit
dl
rm
HTML::Parse.3pm
8277
0444
edit
dl
rm
HTML::Tree.3pm
9982
0444
edit
dl
rm
HTML::Tree::AboutObjects.3pm
37918
0444
edit
dl
rm
HTML::Tree::AboutTrees.3pm
58534
0444
edit
dl
rm
HTML::Tree::Scanning.3pm
34385
0444
edit
dl
rm
HTML::TreeBuilder.3pm
30138
0444
edit
dl
rm
HTTP::Tiny.3pm
27709
0444
edit
dl
rm
IO::AtomicFile.3pm
5381
0444
edit
dl
rm
IO::Compress::Base.3pm
3506
0444
edit
dl
rm
IO::Compress::Bzip2.3pm
23260
0444
edit
dl
rm
IO::Compress::Deflate.3pm
26768
0444
edit
dl
rm
IO::Compress::FAQ.3pm
26718
0444
edit
dl
rm
IO::Compress::Gzip.3pm
34489
0444
edit
dl
rm
IO::Compress::RawDeflate.3pm
27134
0444
edit
dl
rm
IO::Compress::Zip.3pm
40870
0444
edit
dl
rm
IO::InnerFile.3pm
6035
0444
edit
dl
rm
IO::Lines.3pm
3783
0444
edit
dl
rm
IO::Pty.3pm
8579
0444
edit
dl
rm
IO::Scalar.3pm
10679
0444
edit
dl
rm
IO::ScalarArray.3pm
10528
0444
edit
dl
rm
IO::Stringy.3pm
4049
0444
edit
dl
rm
IO::Tty.3pm
8348
0444
edit
dl
rm
IO::Tty::Constant.3pm
10012
0444
edit
dl
rm
IO::Uncompress::AnyInflate.3pm
32800
0444
edit
dl
rm
IO::Uncompress::AnyUncompress.3pm
30767
0444
edit
dl
rm
IO::Uncompress::Base.3pm
3518
0444
edit
dl
rm
IO::Uncompress::Bunzip2.3pm
29171
0444
edit
dl
rm
IO::Uncompress::Gunzip.3pm
31719
0444
edit
dl
rm
IO::Uncompress::Inflate.3pm
29915
0444
edit
dl
rm
IO::Uncompress::RawInflate.3pm
29563
0444
edit
dl
rm
IO::Uncompress::Unzip.3pm
31279
0444
edit
dl
rm
IO::Wrap.3pm
10664
0444
edit
dl
rm
IO::WrapTie.3pm
14987
0444
edit
dl
rm
JSON::PP.3pm
50080
0444
edit
dl
rm
JSON::PP::Boolean.3pm
2667
0444
edit
dl
rm
JSON::Syck.3pm
8094
0444
edit
dl
rm
JSON::XS.3pm
89037
0444
edit
dl
rm
JSON::XS::Boolean.3pm
2857
0444
edit
dl
rm
lib::core::only.3pm
5647
0444
edit
dl
rm
local::lib.3pm
31390
0444
edit
dl
rm
LWP.3pm
28506
0444
edit
dl
rm
LWP::Authen::Ntlm.3pm
7489
0444
edit
dl
rm
LWP::ConnCache.3pm
9967
0444
edit
dl
rm
LWP::Debug.3pm
5608
0444
edit
dl
rm
LWP::MemberMixin.3pm
4821
0444
edit
dl
rm
LWP::Protocol.3pm
8350
0444
edit
dl
rm
LWP::Protocol::https.3pm
5684
0444
edit
dl
rm
LWP::RobotUA.3pm
9022
0444
edit
dl
rm
LWP::Simple.3pm
9016
0444
edit
dl
rm
LWP::UserAgent.3pm
48156
0444
edit
dl
rm
lwpcook.3pm
14838
0444
edit
dl
rm
lwptut.3pm
32441
0444
edit
dl
rm
Module::Build.3pm
44563
0444
edit
dl
rm
Module::Build::API.3pm
89267
0444
edit
dl
rm
Module::Build::Authoring.3pm
17363
0444
edit
dl
rm
Module::Build::Base.3pm
5157
0444
edit
dl
rm
Module::Build::Bundling.3pm
9999
0444
edit
dl
rm
Module::Build::Compat.3pm
10885
0444
edit
dl
rm
Module::Build::ConfigData.3pm
7388
0444
edit
dl
rm
Module::Build::Cookbook.3pm
25946
0444
edit
dl
rm
Module::Build::Notes.3pm
4690
0444
edit
dl
rm
Module::Build::Platform::aix.3pm
4472
0444
edit
dl
rm
Module::Build::Platform::cygwin.3pm
4505
0444
edit
dl
rm
Module::Build::Platform::darwin.3pm
4491
0444
edit
dl
rm
Module::Build::Platform::Default.3pm
4490
0444
edit
dl
rm
Module::Build::Platform::MacOS.3pm
5398
0444
edit
dl
rm
Module::Build::Platform::os2.3pm
4474
0444
edit
dl
rm
Module::Build::Platform::Unix.3pm
4481
0444
edit
dl
rm
Module::Build::Platform::VMS.3pm
7885
0444
edit
dl
rm
Module::Build::Platform::VOS.3pm
4477
0444
edit
dl
rm
Module::Build::Platform::Windows.3pm
4529
0444
edit
dl
rm
Module::Build::PPMMaker.3pm
4886
0444
edit
dl
rm
Mozilla::CA.3pm
3571
0444
edit
dl
rm
Net::CIDR::Lite.3pm
9562
0444
edit
dl
rm
Net::Cmd.3pm
11545
0444
edit
dl
rm
Net::Config.3pm
8100
0444
edit
dl
rm
Net::Domain.3pm
3835
0444
edit
dl
rm
Net::FTP.3pm
27341
0444
edit
dl
rm
Net::FTP::dataconn.3pm
3979
0444
edit
dl
rm
Net::HTTP.3pm
16375
0444
edit
dl
rm
Net::HTTP::NB.3pm
5394
0444
edit
dl
rm
Net::HTTPS.3pm
5438
0444
edit
dl
rm
Net::IP.3pm
27697
0444
edit
dl
rm
Net::libnetFAQ.3pm
14746
0444
edit
dl
rm
Net::Netrc.3pm
6729
0444
edit
dl
rm
Net::NNTP.3pm
23193
0444
edit
dl
rm
Net::POP3.3pm
12259
0444
edit
dl
rm
Net::SMTP.3pm
18880
0444
edit
dl
rm
Net::SSLeay.3pm
349350
0444
edit
dl
rm
Net::SSLeay::Handle.3pm
9127
0444
edit
dl
rm
Net::Time.3pm
4524
0444
edit
dl
rm
ok.3pm
2851
0444
edit
dl
rm
Parse::CPAN::Meta.3pm
10187
0444
edit
dl
rm
POD2::DE::local::lib.3pm
22879
0444
edit
dl
rm
POD2::PT_BR::local::lib.3pm
22762
0444
edit
dl
rm
Socket.3pm
34078
0444
edit
dl
rm
Sub::Identify.3pm
5087
0444
edit
dl
rm
SUPER.3pm
7394
0444
edit
dl
rm
Switch.3pm
19014
0444
edit
dl
rm
TAP::Base.3pm
3401
0444
edit
dl
rm
TAP::Formatter::Base.3pm
6233
0444
edit
dl
rm
TAP::Formatter::Color.3pm
3717
0444
edit
dl
rm
TAP::Formatter::Console.3pm
2722
0444
edit
dl
rm
TAP::Formatter::Console::ParallelSession.3pm
3065
0444
edit
dl
rm
TAP::Formatter::Console::Session.3pm
2832
0444
edit
dl
rm
TAP::Formatter::File.3pm
2693
0444
edit
dl
rm
TAP::Formatter::File::Session.3pm
2847
0444
edit
dl
rm
TAP::Formatter::Session.3pm
3603
0444
edit
dl
rm
TAP::Harness.3pm
21300
0444
edit
dl
rm
TAP::Harness::Beyond.3pm
19118
0444
edit
dl
rm
TAP::Harness::Env.3pm
5467
0444
edit
dl
rm
TAP::Object.3pm
4497
0444
edit
dl
rm
TAP::Parser.3pm
42210
0444
edit
dl
rm
TAP::Parser::Aggregator.3pm
8023
0444
edit
dl
rm
TAP::Parser::Grammar.3pm
8647
0444
edit
dl
rm
TAP::Parser::Iterator.3pm
4993
0444
edit
dl
rm
TAP::Parser::Iterator::Array.3pm
3771
0444
edit
dl
rm
TAP::Parser::Iterator::Process.3pm
4601
0444
edit
dl
rm
TAP::Parser::Iterator::Stream.3pm
3712
0444
edit
dl
rm
TAP::Parser::IteratorFactory.3pm
6904
0444
edit
dl
rm
TAP::Parser::Multiplexer.3pm
4646
0444
edit
dl
rm
TAP::Parser::Result.3pm
7512
0444
edit
dl
rm
TAP::Parser::Result::Bailout.3pm
3293
0444
edit
dl
rm
TAP::Parser::Result::Comment.3pm
3118
0444
edit
dl
rm
TAP::Parser::Result::Plan.3pm
4173
0444
edit
dl
rm
TAP::Parser::Result::Pragma.3pm
3073
0444
edit
dl
rm
TAP::Parser::Result::Test.3pm
7114
0444
edit
dl
rm
TAP::Parser::Result::Unknown.3pm
2973
0444
edit
dl
rm
TAP::Parser::Result::Version.3pm
3154
0444
edit
dl
rm
TAP::Parser::Result::YAML.3pm
3086
0444
edit
dl
rm
TAP::Parser::ResultFactory.3pm
5523
0444
edit
dl
rm
TAP::Parser::Scheduler.3pm
8113
0444
edit
dl
rm
TAP::Parser::Scheduler::Job.3pm
4301
0444
edit
dl
rm
TAP::Parser::Scheduler::Spinner.3pm
3346
0444
edit
dl
rm
TAP::Parser::Source.3pm
8170
0444
edit
dl
rm
TAP::Parser::SourceHandler.3pm
7559
0444
edit
dl
rm
TAP::Parser::SourceHandler::Executable.3pm
5297
0444
edit
dl
rm
TAP::Parser::SourceHandler::File.3pm
4567
0444
edit
dl
rm
TAP::Parser::SourceHandler::Handle.3pm
4425
0444
edit
dl
rm
TAP::Parser::SourceHandler::Perl.3pm
6262
0444
edit
dl
rm
TAP::Parser::SourceHandler::RawTAP.3pm
4434
0444
edit
dl
rm
TAP::Parser::YAMLish::Reader.3pm
3995
0444
edit
dl
rm
TAP::Parser::YAMLish::Writer.3pm
4879
0444
edit
dl
rm
Template.3pm
27909
0444
edit
dl
rm
Template::Base.3pm
8149
0444
edit
dl
rm
Template::Config.3pm
8687
0444
edit
dl
rm
Template::Constants.3pm
7815
0444
edit
dl
rm
Template::Context.3pm
26637
0444
edit
dl
rm
Template::Directive.3pm
4821
0444
edit
dl
rm
Template::Document.3pm
11829
0444
edit
dl
rm
Template::Exception.3pm
6763
0444
edit
dl
rm
Template::FAQ.3pm
14564
0444
edit
dl
rm
Template::Filters.3pm
9817
0444
edit
dl
rm
Template::Grammar.3pm
5039
0444
edit
dl
rm
Template::Iterator.3pm
11413
0444
edit
dl
rm
Template::Manual.3pm
6317
0444
edit
dl
rm
Template::Manual::Config.3pm
79504
0444
edit
dl
rm
Template::Manual::Credits.3pm
8246
0444
edit
dl
rm
Template::Manual::Directives.3pm
77293
0444
edit
dl
rm
Template::Manual::Filters.3pm
20810
0444
edit
dl
rm
Template::Manual::Internals.3pm
23433
0444
edit
dl
rm
Template::Manual::Intro.3pm
14092
0444
edit
dl
rm
Template::Manual::Plugins.3pm
13780
0444
edit
dl
rm
Template::Manual::Syntax.3pm
14549
0444
edit
dl
rm
Template::Manual::Variables.3pm
33110
0444
edit
dl
rm
Template::Manual::Views.3pm
25953
0444
edit
dl
rm
Template::Manual::VMethods.3pm
28195
0444
edit
dl
rm
Template::Modules.3pm
9827
0444
edit
dl
rm
Template::Namespace::Constants.3pm
6002
0444
edit
dl
rm
Template::Parser.3pm
9917
0444
edit
dl
rm
Template::Plugin.3pm
10937
0444
edit
dl
rm
Template::Plugin::Assert.3pm
5446
0444
edit
dl
rm
Template::Plugin::CGI.3pm
6188
0444
edit
dl
rm
Template::Plugin::Datafile.3pm
6601
0444
edit
dl
rm
Template::Plugin::Date.3pm
9538
0444
edit
dl
rm
Template::Plugin::Directory.3pm
11979
0444
edit
dl
rm
Template::Plugin::Dumper.3pm
6078
0444
edit
dl
rm
Template::Plugin::File.3pm
13009
0444
edit
dl
rm
Template::Plugin::Filter.3pm
12936
0444
edit
dl
rm
Template::Plugin::Format.3pm
4895
0444
edit
dl
rm
Template::Plugin::HTML.3pm
7823
0444
edit
dl
rm
Template::Plugin::Image.3pm
11950
0444
edit
dl
rm
Template::Plugin::Iterator.3pm
5061
0444
edit
dl
rm
Template::Plugin::Math.3pm
6623
0444
edit
dl
rm
Template::Plugin::Pod.3pm
4784
0444
edit
dl
rm
Template::Plugin::Procedural.3pm
5631
0444
edit
dl
rm
Template::Plugin::Scalar.3pm
5032
0444
edit
dl
rm
Template::Plugin::String.3pm
17263
0444
edit
dl
rm
Template::Plugin::Table.3pm
11145
0444
edit
dl
rm
Template::Plugin::URL.3pm
8080
0444
edit
dl
rm
Template::Plugin::View.3pm
5479
0444
edit
dl
rm
Template::Plugin::Wrap.3pm
6433
0444
edit
dl
rm
Template::Plugins.3pm
9733
0444
edit
dl
rm
Template::Provider.3pm
14678
0444
edit
dl
rm
Template::Service.3pm
14813
0444
edit
dl
rm
Template::Stash.3pm
11983
0444
edit
dl
rm
Template::Stash::Context.3pm
7130
0444
edit
dl
rm
Template::Stash::XS.3pm
6644
0444
edit
dl
rm
Template::Test.3pm
15524
0444
edit
dl
rm
Template::Toolkit.3pm
9227
0444
edit
dl
rm
Template::Tools.3pm
5001
0444
edit
dl
rm
Template::Tools::tpage.3pm
5806
0444
edit
dl
rm
Template::Tools::ttree.3pm
16567
0444
edit
dl
rm
Template::Tutorial.3pm
4566
0444
edit
dl
rm
Template::Tutorial::Datafile.3pm
19539
0444
edit
dl
rm
Template::Tutorial::Web.3pm
34118
0444
edit
dl
rm
Template::View.3pm
12618
0444
edit
dl
rm
Template::VMethods.3pm
4688
0444
edit
dl
rm
Term::ReadKey.3pm
13029
0444
edit
dl
rm
Test2.3pm
9556
0444
edit
dl
rm
Test2::API.3pm
30424
0444
edit
dl
rm
Test2::API::Breakage.3pm
4988
0444
edit
dl
rm
Test2::API::Context.3pm
17574
0444
edit
dl
rm
Test2::API::Instance.3pm
12404
0444
edit
dl
rm
Test2::API::Stack.3pm
6568
0444
edit
dl
rm
Test2::Event.3pm
9189
0444
edit
dl
rm
Test2::Event::Bail.3pm
3470
0444
edit
dl
rm
Test2::Event::Diag.3pm
3338
0444
edit
dl
rm
Test2::Event::Exception.3pm
3520
0444
edit
dl
rm
Test2::Event::Generic.3pm
7662
0444
edit
dl
rm
Test2::Event::Info.3pm
4261
0444
edit
dl
rm
Test2::Event::Note.3pm
3323
0444
edit
dl
rm
Test2::Event::Ok.3pm
4255
0444
edit
dl
rm
Test2::Event::Plan.3pm
3907
0444
edit
dl
rm
Test2::Event::Skip.3pm
3665
0444
edit
dl
rm
Test2::Event::Subtest.3pm
3573
0444
edit
dl
rm
Test2::Event::Waiting.3pm
3107
0444
edit
dl
rm
Test2::Formatter.3pm
5208
0444
edit
dl
rm
Test2::Formatter::TAP.3pm
9255
0444
edit
dl
rm
Test2::Hub.3pm
16755
0444
edit
dl
rm
Test2::Hub::Interceptor.3pm
2937
0444
edit
dl
rm
Test2::Hub::Interceptor::Terminator.3pm
2980
0444
edit
dl
rm
Test2::Hub::Subtest.3pm
3803
0444
edit
dl
rm
Test2::IPC.3pm
3324
0444
edit
dl
rm
Test2::IPC::Driver.3pm
9512
0444
edit
dl
rm
Test2::IPC::Driver::Files.3pm
3822
0444
edit
dl
rm
Test2::Transition.3pm
18406
0444
edit
dl
rm
Test2::Util.3pm
5123
0444
edit
dl
rm
Test2::Util::ExternalMeta.3pm
5594
0444
edit
dl
rm
Test2::Util::HashBase.3pm
7463
0444
edit
dl
rm
Test2::Util::Trace.3pm
5577
0444
edit
dl
rm
Test::Builder.3pm
26915
0444
edit
dl
rm
Test::Builder::Formatter.3pm
3656
0444
edit
dl
rm
Test::Builder::IO::Scalar.3pm
9740
0444
edit
dl
rm
Test::Builder::Module.3pm
5567
0444
edit
dl
rm
Test::Builder::Tester.3pm
11550
0444
edit
dl
rm
Test::Builder::Tester::Color.3pm
3131
0444
edit
dl
rm
Test::Builder::TodoDiag.3pm
3129
0444
edit
dl
rm
Test::Fatal.3pm
9303
0444
edit
dl
rm
Test::HACKING.3pm
9253
0444
edit
dl
rm
Test::Harness.3pm
11028
0444
edit
dl
rm
Test::LeakTrace.3pm
10022
0444
edit
dl
rm
Test::LeakTrace::JA.3pm
12328
0444
edit
dl
rm
Test::LeakTrace::Script.3pm
5140
0444
edit
dl
rm
Test::MockModule.3pm
10818
0444
edit
dl
rm
Test::More.3pm
43215
0444
edit
dl
rm
Test::More::UTF8.3pm
3602
0444
edit
dl
rm
Test::RequiresInternet.3pm
3944
0444
edit
dl
rm
Test::Simple.3pm
9119
0444
edit
dl
rm
Test::Tester.3pm
15781
0444
edit
dl
rm
Test::Tester::Capture.3pm
2902
0444
edit
dl
rm
Test::Tester::CaptureRunner.3pm
2673
0444
edit
dl
rm
Test::Tutorial.3pm
24261
0444
edit
dl
rm
Test::use::ok.3pm
3841
0444
edit
dl
rm
Test::Warnings.3pm
14231
0444
edit
dl
rm
Text::Glob.3pm
6106
0444
edit
dl
rm
Text::Template.3pm
65499
0444
edit
dl
rm
Text::Template::Preprocess.3pm
6270
0444
edit
dl
rm
Time::Zone.3pm
3413
0444
edit
dl
rm
TimeDate.3pm
2397
0444
edit
dl
rm
Try::Tiny.3pm
20343
0444
edit
dl
rm
Types::Serialiser.3pm
11473
0444
edit
dl
rm
Types::Serialiser::Error.3pm
2705
0444
edit
dl
rm
version.3pm
13937
0444
edit
dl
rm
version::Internals.3pm
30287
0444
edit
dl
rm
WWW::Mechanize.3pm
68196
0444
edit
dl
rm
WWW::Mechanize::Cookbook.3pm
7159
0444
edit
dl
rm
WWW::Mechanize::Examples.3pm
22490
0444
edit
dl
rm
WWW::Mechanize::FAQ.3pm
24359
0444
edit
dl
rm
WWW::Mechanize::Image.3pm
6490
0444
edit
dl
rm
WWW::Mechanize::Link.3pm
6518
0444
edit
dl
rm
XML::NamespaceSupport.3pm
13052
0444
edit
dl
rm
XML::Parser.3pm
26296
0444
edit
dl
rm
XML::Parser::Expat.3pm
26799
0444
edit
dl
rm
XML::Parser::Style::Debug.3pm
4408
0444
edit
dl
rm
XML::Parser::Style::Objects.3pm
4888
0444
edit
dl
rm
XML::Parser::Style::Stream.3pm
5925
0444
edit
dl
rm
XML::Parser::Style::Subs.3pm
4863
0444
edit
dl
rm
XML::Parser::Style::Tree.3pm
5529
0444
edit
dl
rm
XML::SAX.3pm
9229
0444
edit
dl
rm
XML::SAX::Base.3pm
13704
0444
edit
dl
rm
XML::SAX::BuildSAXBase.3pm
13700
0444
edit
dl
rm
XML::SAX::DocumentLocator.3pm
5239
0444
edit
dl
rm
XML::SAX::Exception.3pm
5622
0444
edit
dl
rm
XML::SAX::Expat.3pm
6404
0444
edit
dl
rm
XML::SAX::Intro.3pm
20220
0444
edit
dl
rm
XML::SAX::ParserFactory.3pm
7919
0444
edit
dl
rm
XML::SAX::PurePerl.3pm
6172
0444
edit
dl
rm
XML::SAX::PurePerl::Reader.3pm
4103
0444
edit
dl
rm
XML::Simple.3pm
65589
0444
edit
dl
rm
XML::Simple::FAQ.3pm
27223
0444
edit
dl
rm
YAML.3pm
29980
0444
edit
dl
rm
YAML::Any.3pm
7487
0444
edit
dl
rm
YAML::Dumper.3pm
4776
0444
edit
dl
rm
YAML::Dumper::Base.3pm
4642
0444
edit
dl
rm
YAML::Error.3pm
4681
0444
edit
dl
rm
YAML::Loader.3pm
4766
0444
edit
dl
rm
YAML::Loader::Base.3pm
4642
0444
edit
dl
rm
YAML::Marshall.3pm
4640
0444
edit
dl
rm
YAML::Node.3pm
6743
0444
edit
dl
rm
YAML::Syck.3pm
10806
0444
edit
dl
rm
YAML::Tag.3pm
4499
0444
edit
dl
rm
YAML::Types.3pm
4716
0444
edit
dl
rm
Edit:
/usr/local/share/man/man3/HTML::Tree::AboutObjects.3pm
(37918B)
.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "HTML::Tree::AboutObjects 3" .TH HTML::Tree::AboutObjects 3 "2016-10-25" "perl v5.16.3" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" HTML::Tree::AboutObjects \-\- article: "User's View of Object\-Oriented Modules" .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& # This an article, not a module. .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" The following article by Sean M. Burke first appeared in \fIThe Perl Journal\fR #17 and is copyright 2000 The Perl Journal. It appears courtesy of Jon Orwant and The Perl Journal. This document may be distributed under the same terms as Perl itself. .SH "A User's View of Object-Oriented Modules" .IX Header "A User's View of Object-Oriented Modules" \&\-\- Sean M. Burke .PP The first time that most Perl programmers run into object-oriented programming when they need to use a module whose interface is object-oriented. This is often a mystifying experience, since talk of \&\*(L"methods\*(R" and \*(L"constructors\*(R" is unintelligible to programmers who thought that functions and variables was all there was to worry about. .PP Articles and books that explain object-oriented programming (\s-1OOP\s0), do so in terms of how to program that way. That's understandable, and if you learn to write object-oriented code of your own, you'd find it easy to use object-oriented code that others write. But this approach is the \&\fIlong\fR way around for people whose immediate goal is just to use existing object-oriented modules, but who don't yet want to know all the gory details of having to write such modules for themselves. .PP This article is for those programmers \*(-- programmers who want to know about objects from the perspective of using object-oriented modules. .SS "Modules and Their Functional Interfaces" .IX Subsection "Modules and Their Functional Interfaces" Modules are the main way that Perl provides for bundling up code for later use by yourself or others. As I'm sure you can't help noticing from reading \&\fIThe Perl Journal\fR, \s-1CPAN \s0(the Comprehensive Perl Archive Network) is the repository for modules (or groups of modules) that others have written, to do anything from composing music to accessing Web pages. A good deal of those modules even come with every installation of Perl. .PP One module that you may have used before, and which is fairly typical in its interface, is Text::Wrap. It comes with Perl, so you don't even need to install it from \s-1CPAN. \s0 You use it in a program of yours, by having your program code say early on: .PP .Vb 1 \& use Text::Wrap; .Ve .PP and after that, you can access a function called \f(CW\*(C`wrap\*(C'\fR, which inserts line-breaks in text that you feed it, so that the text will be wrapped to seventy-two (or however many) columns. .PP The way this \f(CW\*(C`use Text::Wrap\*(C'\fR business works is that the module Text::Wrap exists as a file \*(L"Text/Wrap.pm\*(R" somewhere in one of your library directories. That file contains Perl code... .Sp .RS 4 Footnote: And mixed in with the Perl code, there's documentation, which is what you read with \*(L"perldoc Text::Wrap\*(R". The perldoc program simply ignores the code and formats the documentation text, whereas \*(L"use Text::Wrap\*(R" loads and runs the code while ignoring the documentation. .RE .PP \&...which, among other things, defines a function called \f(CW\*(C`Text::Wrap::wrap\*(C'\fR, and then \f(CW\*(C`exports\*(C'\fR that function, which means that when you say \f(CW\*(C`wrap\*(C'\fR after having said \*(L"use Text::Wrap\*(R", you'll be actually calling the \&\f(CW\*(C`Text::Wrap::wrap\*(C'\fR function. Some modules don't export their functions, so you have to call them by their full name, like \&\f(CW\*(C`Text::Wrap::wrap(...parameters...)\*(C'\fR. .PP Regardless of whether the typical module exports the functions it provides, a module is basically just a container for chunks of code that do useful things. The way the module allows for you to interact with it, is its \fIinterface\fR. And when, like with Text::Wrap, its interface consists of functions, the module is said to have a \fBfunctional interface\fR. .Sp .RS 4 Footnote: the term \*(L"function\*(R" (and therefore "function\fIal\fR") has various senses. I'm using the term here in its broadest sense, to refer to routines \*(-- bits of code that are called by some name and which take parameters and return some value. .RE .PP Using modules with functional interfaces is straightforward \*(-- instead of defining your own \*(L"wrap\*(R" function with \f(CW\*(C`sub wrap { ... }\*(C'\fR, you entrust \*(L"use Text::Wrap\*(R" to do that for you, along with whatever other functions its defines and exports, according to the module's documentation. Without too much bother, you can even write your own modules to contain your frequently used functions; I suggest having a look at the \f(CW\*(C`perlmod\*(C'\fR man page for more leads on doing this. .SS "Modules with Object-Oriented Interfaces" .IX Subsection "Modules with Object-Oriented Interfaces" So suppose that one day you want to write a program that will automate the process of \f(CW\*(C`ftp\*(C'\fRing a bunch of files from one server down to your local machine, and then off to another server. .PP A quick browse through search.cpan.org turns up the module \*(L"Net::FTP\*(R", which you can download and install it using normal installation instructions (unless your sysadmin has already installed it, as many have). .PP Like Text::Wrap or any other module with a familiarly functional interface, you start off using Net::FTP in your program by saying: .PP .Vb 1 \& use Net::FTP; .Ve .PP However, that's where the similarity ends. The first hint of difference is that the documentation for Net::FTP refers to it as a \&\fBclass\fR. A class is a kind of module, but one that has an object-oriented interface. .PP Whereas modules like Text::Wrap provide bits of useful code as \fIfunctions\fR, to be called like \&\f(CW\*(C`function(...parameters...)\*(C'\fR or like \&\f(CW\*(C`PackageName::function(...parameters...)\*(C'\fR, Net::FTP and other modules with object-oriented interfaces provide \fBmethods\fR. Methods are sort of like functions in that they have a name and parameters; but methods look different, and are different, because you have to call them with a syntax that has a class name or an object as a special argument. I'll explain the syntax for method calls, and then later explain what they all mean. .PP Some methods are meant to be called as \fBclass methods\fR, with the class name (same as the module name) as a special argument. Class methods look like this: .PP .Vb 3 \& ClassName\->methodname(parameter1, parameter2, ...) \& ClassName\->methodname() # if no parameters \& ClassName\->methodname # same as above .Ve .PP which you will sometimes see written: .PP .Vb 2 \& methodname ClassName (parameter1, parameter2, ...) \& methodname ClassName # if no parameters .Ve .PP Basically all class methods are for making new objects, and methods that make objects are called "\fBconstructors\fR\*(L" (and the process of making them is called \*(R"constructing\*(L" or \*(R"instantiating\*(L"). Constructor methods typically have the name \*(R"new\*(L", or something including \*(R"new\*(L" (\*(R"new_from_file\*(L", etc.); but they can conceivably be named anything \*(-- \s-1DBI\s0's constructor method is named \*(R"connect", for example. .PP The object that a constructor method returns is typically captured in a scalar variable: .PP .Vb 1 \& $object = ClassName\->new(param1, param2...); .Ve .PP Once you have an object (more later on exactly what that is), you can use the other kind of method call syntax, the syntax for \fBobject method\fR calls. Calling object methods is just like class methods, except that instead of the ClassName as the special argument, you use an expression that yeilds an \*(L"object\*(R". Usually this is just a scalar variable that you earlier captured the output of the constructor in. Object method calls look like this: .PP .Vb 3 \& $object\->methodname(parameter1, parameter2, ...); \& $object\->methodname() # if no parameters \& $object\->methodname # same as above .Ve .PP which is occasionally written as: .PP .Vb 2 \& methodname $object (parameter1, parameter2, ...) \& methodname $object # if no parameters .Ve .PP Examples of method calls are: .PP .Vb 10 \& my $session1 = Net::FTP\->new("ftp.myhost.com"); \& # Calls a class method "new", from class Net::FTP, \& # with the single parameter "ftp.myhost.com", \& # and saves the return value (which is, as usual, \& # an object), in $session1. \& # Could also be written: \& # new Net::FTP(\*(Aqftp.myhost.com\*(Aq) \& $session1\->login("sburke","aoeuaoeu") \& || die "failed to login!\en"; \& # calling the object method "login" \& print "Dir:\en", $session1\->dir(), "\en"; \& $session1\->quit; \& # same as $session1\->quit() \& print "Done\en"; \& exit; .Ve .PP Incidentally, I suggest always using the syntaxes with parentheses and \&\*(L"\->\*(R" in them, .Sp .RS 4 Footnote: the character-pair \*(L"\->\*(R" is supposed to look like an arrow, not \*(L"negative greater-than\*(R"! .RE .PP and avoiding the syntaxes that start out \*(L"methodname \f(CW$object\fR\*(R" or \&\*(L"methodname ModuleName\*(R". When everything's going right, they all mean the same thing as the \*(L"\->\*(R" variants, but the syntax with \*(L"\->\*(R" is more visually distinct from function calls, as well as being immune to some kinds of rare but puzzling ambiguities that can arise when you're trying to call methods that have the same name as subroutines you've defined. .PP But, syntactic alternatives aside, all this talk of constructing objects and object methods begs the question \*(-- what \fIis\fR an object? There are several angles to this question that the rest of this article will answer in turn: what can you do with objects? what's in an object? what's an object value? and why do some modules use objects at all? .SS "What Can You Do with Objects?" .IX Subsection "What Can You Do with Objects?" You've seen that you can make objects, and call object methods with them. But what are object methods for? The answer depends on the class: .PP A Net::FTP object represents a session between your computer and an \s-1FTP\s0 server. So the methods you call on a Net::FTP object are for doing whatever you'd need to do across an \s-1FTP\s0 connection. You make the session and log in: .PP .Vb 5 \& my $session = Net::FTP\->new(\*(Aqftp.aol.com\*(Aq); \& die "Couldn\*(Aqt connect!" unless defined $session; \& # The class method call to "new" will return \& # the new object if it goes OK, otherwise it \& # will return undef. \& \& $session\->login(\*(Aqsburke\*(Aq, \*(Aqp@ssw3rD\*(Aq) \& || die "Did I change my password again?"; \& # The object method "login" will give a true \& # return value if actually logs in, otherwise \& # it\*(Aqll return false. .Ve .PP You can use the session object to change directory on that session: .PP .Vb 3 \& $session\->cwd("/home/sburke/public_html") \& || die "Hey, that was REALLY supposed to work!"; \& # if the cwd fails, it\*(Aqll return false .Ve .PP \&...get files from the machine at the other end of the session... .PP .Vb 5 \& foreach my $f (\*(Aqlog_report_ua.txt\*(Aq, \*(Aqlog_report_dom.txt\*(Aq, \& \*(Aqlog_report_browsers.txt\*(Aq) \& { \& $session\->get($f) || warn "Getting $f failed!" \& }; .Ve .PP \&...and plenty else, ending finally with closing the connection: .PP .Vb 1 \& $session\->quit(); .Ve .PP In short, object methods are for doing things related to (or with) whatever the object represents. For \s-1FTP\s0 sessions, it's about sending commands to the server at the other end of the connection, and that's about it \*(-- there, methods are for doing something to the world outside the object, and the objects is just something that specifies what bit of the world (well, what \s-1FTP\s0 session) to act upon. .PP With most other classes, however, the object itself stores some kind of information, and it typically makes no sense to do things with such an object without considering the data that's in the object. .SS "What's \fIin\fP an Object?" .IX Subsection "What's in an Object?" An object is (with rare exceptions) a data structure containing a bunch of attributes, each of which has a value, as well as a name that you use when you read or set the attribute's value. Some of the object's attributes are private, meaning you'll never see them documented because they're not for you to read or write; but most of the object's documented attributes are at least readable, and usually writeable, by you. Net::FTP objects are a bit thin on attributes, so we'll use objects from the class Business::US_Amort for this example. Business::US_Amort is a very simple class (available from \s-1CPAN\s0) that I wrote for making calculations to do with loans (specifically, amortization, using US-style algorithms). .PP An object of the class Business::US_Amort represents a loan with particular parameters, i.e., attributes. The most basic attributes of a \&\*(L"loan object\*(R" are its interest rate, its principal (how much money it's for), and it's term (how long it'll take to repay). You need to set these attributes before anything else can be done with the object. The way to get at those attributes for loan objects is just like the way to get at attributes for any class's objects: through accessors. An \fBaccessor\fR is simply any method that accesses (whether reading or writing, \s-1AKA\s0 getting or putting) some attribute in the given object. Moreover, accessors are the \fBonly\fR way that you can change an object's attributes. (If a module's documentation wants you to know about any other way, it'll tell you.) .PP Usually, for simplicity's sake, an accessor is named after the attribute it reads or writes. With Business::US_Amort objects, the accessors you need to use first are \f(CW\*(C`principal\*(C'\fR, \f(CW\*(C`interest_rate\*(C'\fR, and \f(CW\*(C`term\*(C'\fR. Then, with at least those attributes set, you can call the \f(CW\*(C`run\*(C'\fR method to figure out several things about the loan. Then you can call various accessors, like \f(CW\*(C`total_paid_toward_interest\*(C'\fR, to read the results: .PP .Vb 6 \& use Business::US_Amort; \& my $loan = Business::US_Amort\->new; \& # Set the necessary attributes: \& $loan\->principal(123654); \& $loan\->interest_rate(9.25); \& $loan\->term(20); # twenty years \& \& # NOW we know enough to calculate: \& $loan\->run; \& \& # And see what came of that: \& print \& "Total paid toward interest: A WHOPPING ", \& $loan\->total_paid_interest, "!!\en"; .Ve .PP This illustrates a convention that's common with accessors: calling the accessor with no arguments (as with \f(CW$loan\fR\->total_paid_interest) usually means to read the value of that attribute, but providing a value (as with \f(CW$loan\fR\->term(20)) means you want that attribute to be set to that value. This stands to reason: why would you be providing a value, if not to set the attribute to that value? .PP Although a loan's term, principal, and interest rates are all single numeric values, an objects values can any kind of scalar, or an array, or even a hash. Moreover, an attribute's value(s) can be objects themselves. For example, consider \s-1MIDI\s0 files (as I wrote about in TPJ#13): a \s-1MIDI\s0 file usually consists of several tracks. A \s-1MIDI\s0 file is complex enough to merit being an object with attributes like its overall tempo, the file-format variant it's in, and the list of instrument tracks in the file. But tracks themselves are complex enough to be objects too, with attributes like their track-type, a list of \s-1MIDI\s0 commands if they're a \s-1MIDI\s0 track, or raw data if they're not. So I ended up writing the \s-1MIDI\s0 modules so that the \*(L"tracks\*(R" attribute of a MIDI::Opus object is an array of objects from the class MIDI::Track. This may seem like a runaround \*(-- you ask what's in one object, and get \&\fIanother\fR object, or several! But in this case, it exactly reflects what the module is for \*(-- \s-1MIDI\s0 files contain \s-1MIDI\s0 tracks, which then contain data. .SS "What is an Object Value?" .IX Subsection "What is an Object Value?" When you call a constructor like Net::FTP\->new(\fIhostname\fR), you get back an object value, a value you can later use, in combination with a method name, to call object methods. .PP Now, so far we've been pretending, in the above examples, that the variables \f(CW$session\fR or \f(CW$loan\fR \fIare\fR the objects you're dealing with. This idea is innocuous up to a point, but it's really a misconception that will, at best, limit you in what you know how to do. The reality is not that the variables \f(CW$session\fR or \f(CW$query\fR are objects; it's a little more indirect \*(-- they \fIhold\fR values that symbolize objects. The kind of value that \f(CW$session\fR or \f(CW$query\fR hold is what I'm calling an object value. .PP To understand what kind of value this is, first think about the other kinds of scalar values you know about: The first two scalar values you probably ever ran into in Perl are \fBnumbers\fR and \fBstrings\fR, which you learned (or just assumed) will usually turn into each other on demand; that is, the three-character string \*(L"2.5\*(R" can become the quantity two and a half, and vice versa. Then, especially if you started using \&\f(CW\*(C`perl \-w\*(C'\fR early on, you learned about the \fBundefined value\fR, which can turn into 0 if you treat it as a number, or the empty-string if you treat it as a string. .Sp .RS 4 Footnote: You may \fIalso\fR have been learning about references, in which case you're ready to hear that object values are just a kind of reference, except that they reflect the class that created thing they point to, instead of merely being a plain old array reference, hash reference, etc. \fIIf\fR this makes makes sense to you, and you want to know more about how objects are implemented in Perl, have a look at the \&\f(CW\*(C`perltoot\*(C'\fR man page. .RE .PP And now you're learning about \fBobject values\fR. An object value is a value that points to a data structure somewhere in memory, which is where all the attributes for this object are stored. That data structure as a whole belongs to a class (probably the one you named in the constructor method, like ClassName\->new), so that the object value can be used as part of object method calls. .PP If you want to actually \fIsee\fR what an object value is, you might try just saying \*(L"print \f(CW$object\fR\*(R". That'll get you something like this: .PP .Vb 1 \& Net::FTP=GLOB(0x20154240) .Ve .PP or .PP .Vb 1 \& Business::US_Amort=HASH(0x15424020) .Ve .PP That's not very helpful if you wanted to really get at the object's insides, but that's because the object value is only a symbol for the object. This may all sound very abstruse and metaphysical, so a real-world allegory might be very helpful: .Sp .RS 4 You get an advertisement in the mail saying that you have been (im)personally selected to have the rare privilege of applying for a credit card. For whatever reason, \fIthis\fR offer sounds good to you, so you fill out the form and mail it back to the credit card company. They gleefully approve the application and create your account, and send you a card with a number on it. .Sp Now, you can do things with the number on that card \*(-- clerks at stores can ring up things you want to buy, and charge your account by keying in the number on the card. You can pay for things you order online by punching in the card number as part of your online order. You can pay off part of the account by sending the credit card people some of your money (well, a check) with some note (usually the pre-printed slip) that has the card number for the account you want to pay toward. And you should be able to call the credit card company's computer and ask it things about the card, like its balance, its credit limit, its \s-1APR,\s0 and maybe an itemization of recent purchases ad payments. .Sp Now, what you're \fIreally\fR doing is manipulating a credit card \&\fIaccount\fR, a completely abstract entity with some data attached to it (balance, \s-1APR,\s0 etc). But for ease of access, you have a credit card \&\fInumber\fR that is a symbol for that account. Now, that symbol is just a bunch of digits, and the number is effectively meaningless and useless in and of itself \*(-- but in the appropriate context, it's understood to \&\fImean\fR the credit card account you're accessing. .RE .PP This is exactly the relationship between objects and object values, and from this analogy, several facts about object values are a bit more explicable: .PP * An object value does nothing in and of itself, but it's useful when you use it in the context of an \f(CW$object\fR\->method call, the same way that a card number is useful in the context of some operation dealing with a card account. .PP Moreover, several copies of the same object value all refer to the same object, the same way that making several copies of your card number won't change the fact that they all still refer to the same single account (this is true whether you're \*(L"copying\*(R" the number by just writing it down on different slips of paper, or whether you go to the trouble of forging exact replicas of your own plastic credit card). That's why this: .PP .Vb 2 \& $x = Net::FTP\->new("ftp.aol.com"); \& $x\->login("sburke", "aoeuaoeu"); .Ve .PP does the same thing as this: .PP .Vb 4 \& $x = Net::FTP\->new("ftp.aol.com"); \& $y = $x; \& $z = $y; \& $z\->login("sburke", "aoeuaoeu"); .Ve .PP That is, \f(CW$z\fR and \f(CW$y\fR and \f(CW$x\fR are three different \fIslots\fR for values, but what's in those slots are all object values pointing to the same object \*(-- you don't have three different \s-1FTP\s0 connections, just three variables with values pointing to the some single \s-1FTP\s0 connection. .PP * You can't tell much of anything about the object just by looking at the object value, any more than you can see your credit account balance by holding the plastic card up to the light, or by adding up the digits in your credit card number. .PP * You can't just make up your own object values and have them work \*(-- they can come only from constructor methods of the appropriate class. Similarly, you get a credit card number \fIonly\fR by having a bank approve your application for a credit card account \*(-- at which point \fIthey\fR let \fIyou\fR know what the number of your new card is. .PP Now, there's even more to the fact that you can't just make up your own object value: even though you can print an object value and get a string like \*(L"Net::FTP=GLOB(0x20154240)\*(R", that string is just a \&\fIrepresentation\fR of an object value. .PP Internally, an object value has a basically different type from a string, or a number, or the undefined value \*(-- if \f(CW$x\fR holds a real string, then that value's slot in memory says "this is a value of type \&\fIstring\fR, and its characters are...\*(L", whereas if it's an object value, the value's slot in memory says, \*(R"this is a value of type \fIreference\fR, and the location in memory that it points to is..." (and by looking at what's at that location, Perl can tell the class of what's there). .PP Perl programmers typically don't have to think about all these details of Perl's internals. Many other languages force you to be more conscious of the differences between all of these (and also between types of numbers, which are stored differently depending on their size and whether they have fractional parts). But Perl does its best to hide the different types of scalars from you \*(-- it turns numbers into strings and back as needed, and takes the string or number representation of undef or of object values as needed. However, you can't go from a string representation of an object value, back to an object value. And that's why this doesn't work: .PP .Vb 9 \& $x = Net::FTP\->new(\*(Aqftp.aol.com\*(Aq); \& $y = Net::FTP\->new(\*(Aqftp.netcom.com\*(Aq); \& $z = Net::FTP\->new(\*(Aqftp.qualcomm.com\*(Aq); \& $all = join(\*(Aq \*(Aq, $x,$y,$z); # !!! \& ...later... \& ($aol, $netcom, $qualcomm) = split(\*(Aq \*(Aq, $all); # !!! \& $aol\->login("sburke", "aoeuaoeu"); \& $netcom\->login("sburke", "qjkxqjkx"); \& $qualcomm\->login("smb", "dhtndhtn"); .Ve .PP This fails because \f(CW$aol\fR ends up holding merely the \fBstring representation\fR of the object value from \f(CW$x\fR, not the object value itself \*(-- when \&\f(CW\*(C`join\*(C'\fR tried to join the characters of the \*(L"strings\*(R" \f(CW$x\fR, \f(CW$y\fR, and \f(CW$z\fR, Perl saw that they weren't strings at all, so it gave \f(CW\*(C`join\*(C'\fR their string representations. .PP Unfortunately, this distinction between object values and their string representations doesn't really fit into the analogy of credit card numbers, because credit card numbers really \fIare\fR numbers \*(-- even thought they don't express any meaningful quantity, if you stored them in a database as a quantity (as opposed to just an \s-1ASCII\s0 string), that wouldn't stop them from being valid as credit card numbers. .PP This may seem rather academic, but there's there's two common mistakes programmers new to objects often make, which make sense only in terms of the distinction between object values and their string representations: .PP The first common error involves forgetting (or never having known in the first place) that when you go to use a value as a hash key, Perl uses the string representation of that value. When you want to use the numeric value two and a half as a key, Perl turns it into the three-character string \*(L"2.5\*(R". But if you then want to use that string as a number, Perl will treat it as meaning two and a half, so you're usually none the wiser that Perl converted the number to a string and back. But recall that Perl can't turn strings back into objects \*(-- so if you tried to use a Net::FTP object value as a hash key, Perl actually used its string representation, like \*(L"Net::FTP=GLOB(0x20154240)\*(R", but that string is unusable as an object value. (Incidentally, there's a module Tie::RefHash that implements hashes that \fIdo\fR let you use real object-values as keys.) .PP The second common error with object values is in trying to save an object value to disk (whether printing it to a file, or storing it in a conventional database file). All you'll get is the string, which will be useless. .PP When you want to save an object and restore it later, you may find that the object's class already provides a method specifically for this. For example, MIDI::Opus provides methods for writing an object to disk as a standard \s-1MIDI\s0 file. The file can later be read back into memory by a MIDI::Opus constructor method, which will return a new MIDI::Opus object representing whatever file you tell it to read into memory. Similar methods are available with, for example, classes that manipulate graphic images and can save them to files, which can be read back later. .PP But some classes, like Business::US_Amort, provide no such methods for storing an object in a file. When this is the case, you can try using any of the Data::Dumper, Storable, or FreezeThaw modules. Using these will be unproblematic for objects of most classes, but it may run into limitations with others. For example, a Business::US_Amort object can be turned into a string with Data::Dumper, and that string written to a file. When it's restored later, its attributes will be accessible as normal. But in the unlikely case that the loan object was saved in mid-calculation, the calculation may not be resumable. This is because of the way that that \fIparticular\fR class does its calculations, but similar limitations may occur with objects from other classses. .PP But often, even \fIwanting\fR to save an object is basically wrong \*(-- what would saving an ftp \fIsession\fR even mean? Saving the hostname, username, and password? current directory on both machines? the local \s-1TCP/IP\s0 port number? In the case of \*(L"saving\*(R" a Net::FTP object, you're better off just saving whatever details you actually need for your own purposes, so that you can make a new object later and just set those values for it. .SS "So Why Do Some Modules Use Objects?" .IX Subsection "So Why Do Some Modules Use Objects?" All these details of using objects are definitely enough to make you wonder \*(-- is it worth the bother? If you're a module author, writing your module with an object-oriented interface restricts the audience of potential users to those who understand the basic concepts of objects and object values, as well as Perl's syntax for calling methods. Why complicate things by having an object-oriented interface? .PP A somewhat esoteric answer is that a module has an object-oriented interface because the module's insides are written in an object-oriented style. This article is about the basics of object-oriented \fIinterfaces\fR, and it'd be going far afield to explain what object-oriented \fIdesign\fR is. But the short story is that object-oriented design is just one way of attacking messy problems. It's a way that many programmers find very helpful (and which others happen to find to be far more of a hassle than it's worth, incidentally), and it just happens to show up for you, the module user, as merely the style of interface. .PP But a simpler answer is that a functional interface is sometimes a hindrance, because it limits the number of things you can do at once \*(-- limiting it, in fact, to one. For many problems that some modules are meant to solve, doing without an object-oriented interface would be like wishing that Perl didn't use filehandles. The ideas are rather simpler \&\*(-- just imagine that Perl let you access files, but \fIonly\fR one at a time, with code like: .PP .Vb 5 \& open("foo.txt") || die "Can\*(Aqt open foo.txt: $!"; \& while(readline) { \& print $_ if /bar/; \& } \& close; .Ve .PP That hypothetical kind of Perl would be simpler, by doing without filehandles. But you'd be out of luck if you wanted to read from one file while reading from another, or read from two and print to a third. .PP In the same way, a functional \s-1FTP\s0 module would be fine for just uploading files to one server at a time, but it wouldn't allow you to easily write programs that make need to use \fIseveral\fR simultaneous sessions (like \*(L"look at server A and server B, and if A has a file called X.dat, then download it locally and then upload it to server B \*(-- except if B has a file called Y.dat, in which case do it the other way around\*(R"). .PP Some kinds of problems that modules solve just lend themselves to an object-oriented interface. For those kinds of tasks, a functional interface would be more familiar, but less powerful. Learning to use object-oriented modules' interfaces does require becoming comfortable with the concepts from this article. But in the end it will allow you to use a broader range of modules and, with them, to write programs that can do more. .PP \&\fB[end body of article]\fR .SS "[Author Credit]" .IX Subsection "[Author Credit]" Sean M. Burke has contributed several modules to \s-1CPAN,\s0 about half of them object-oriented. .PP [The next section should be in a greybox:] .SS "The Gory Details" .IX Subsection "The Gory Details" For sake of clarity of explanation, I had to oversimplify some of the facts about objects. Here's a few of the gorier details: .PP * Every example I gave of a constructor was a class method. But object methods can be constructors, too, if the class was written to work that way: \f(CW$new\fR = \f(CW$old\fR\->copy, \f(CW$node_y\fR = \f(CW$node_x\fR\->new_subnode, or the like. .PP * I've given the impression that there's two kinds of methods: object methods and class methods. In fact, the same method can be both, because it's not the kind of method it is, but the kind of calls it's written to accept \*(-- calls that pass an object, or calls that pass a class-name. .PP * The term \*(L"object value\*(R" isn't something you'll find used much anywhere else. It's just my shorthand for what would properly be called an \&\*(L"object reference\*(R" or \*(L"reference to a blessed item\*(R". In fact, people usually say \*(L"object\*(R" when they properly mean a reference to that object. .PP * I mentioned creating objects with \fIcon\fRstructors, but I didn't mention destroying them with \fIde\fRstructor \*(-- a destructor is a kind of method that you call to tidy up the object once you're done with it, and want it to neatly go away (close connections, delete temporary files, free up memory, etc). But because of the way Perl handles memory, most modules won't require the user to know about destructors. .PP * I said that class method syntax has to have the class name, as in \&\f(CW$session\fR = \fBNet::FTP\fR\->new($host). Actually, you can instead use any expression that returns a class name: \f(CW$ftp_class\fR = 'Net::FTP'; \f(CW$session\fR = \fB\f(CB$ftp_class\fB\fR\->new($host). Moreover, instead of the method name for object\- or class-method calls, you can use a scalar holding the method name: \f(CW$foo\fR\->\fB\f(CB$method\fB\fR($host). But, in practice, these syntaxes are rarely useful. .PP And finally, to learn about objects from the perspective of writing your own classes, see the \f(CW\*(C`perltoot\*(C'\fR documentation, or Damian Conway's exhaustive and clear book \fIObject Oriented Perl\fR (Manning Publications 1999, \s-1ISBN 1\-884777\-79\-1\s0). .SH "BACK" .IX Header "BACK" Return to the HTML::Tree docs.
Save
cmd:
run