1.Shell中命令執行結果或者文件內容會自動將換行符或者單個多個空格轉化爲單空格賦值給變量$
,而在perl中命令執行結果和文件內容會以行爲單位(包括\n)賦值給數組變量@
中各元素,對於一般變量$
命令執行結果會整體賦值給變量,而文件句柄則會以行爲單位依次賦值給變量,因此perl可以保存原始文本的格式。
2.Program = Data Structure + Logical + operator/function/command
,shell中存在數組變量但應用較少,但平臺下的常用指令均可應用在shell中,因此shell功能依舊很強大,perl中數據結構有列表()
、變量$
、數組@
、哈希%
、函數&
以及衆多操作符和內置外置函數。
perl 面向對象機制:
1.perl的引用即是指針,因此perl中都是值傳遞。
2.perl中所謂的類即是包名,也就是包/模塊的字符串,而所謂的方法即是包/模塊中定義的函數,使用->
方式調用函數後隱形傳遞函數模塊名作爲第一個參數,而是用::
方式調用則無隱形傳遞,隱形傳遞模塊名實現模塊內定義的函數能獲取到模塊名進而進行方法調用,是perl實現僞面向對象特性重要設計。
$class = |package_name|
$class->|sub|
|package_name|->|sub|
3.不同於模塊中的函數,模塊中定義的變量只能通過::
實現訪問,因此爲了實現意義上的類或者對象 數據和方法 的聯合(表面上即均通過->
符號調用,不同的是->
調用的方法是模塊中定義的函數,->
調用的數據是指針指向的內存塊)perl引入了bless操作符。
3.bless用於將一個引用變量(指針變量)關聯到一個類即模塊名上(區別於引用的全新數據格式,一般爲|class|=HASH<0x12345>
),bless $ref |package_name|
或者 bless $ref $class
, 這樣$ref
即可通過->
調用引用的數據又可通過->
調用模塊中的方法,這也是perl實現僞類方法(即模塊函數)和對應數據關聯的關鍵設計。
參考程序:
person.pm
#!/usr/bin/perl
package person;
sub new {
my $class = shift;
print "Class = $class \n";
my $self = {};
$self->{'name'} = shift;
$self->{'sex'} = shift;
bless $self,$class;
return $self;
}
sub getname {
my ($self) = @_;
return $self->{'name'};
}
sub setname {
my ($self,$name) = @_;
return $self->{'name'} = $name;
}
sub getsex {
my ($self) = @_;
return $self->{'sex'};
}
sub setsex {
my ($self,$sex) = @_;
$self->{'sex'} = $sex;
}
sub echo {
print "placeholder\n";
}
1;
person.pl
#!/usr/bin/perl -w
use lib '/home/bruce/lib';
use person;
use ejng::zhang;
sub main {
my $tom = person->new('tom','male');
my $lili = person->new('lili','female');
print $tom->getname,"\n";
print $lili->getname,"\n";
print $tom->getsex,"\n";
print $lili->getsex,"\n";
$tom->setname('tom_crush');
$lili->setname('lili_zhang');
print $tom->getname,"\n";
print $lili->getname,"\n";
}
&main;
4.實現在程序中直接使用模塊中定義子例程名字調用方法有兩種,均於perl自身import機制有關。
方法1:使用半底層的perl 符號hash將子例程的指針定義到main包裏,缺點是必須在use 後使用import,否則不生效。
sub.pm
#!/usr/bin/perl
package sub;
sub import {
foreach (@_) {
*{"main::$_"} = \&$_;
}
}
sub echo {
print "Placeholder!\n";
}
1;
sub.pl
#!/usr/bin/perl
use sub qw/echo/;
echo;
方法2:使用perl官方的Exporter
模塊。
sub.pm
#!/usr/bin/perl
package sub;
use Exporter;
our @EXPORT = qw/echo/;
our @ISA = qw(Exporter);
sub echo {
print "Placeholder!\n";
}
1;
sub.pl
#!/usr/bin/perl
use sub;
echo;
5.@ISA實現所謂類的繼承機制。
Reference:https://my.oschina.net/OliverTwist/blog/225178