顯示具有 Perl 標籤的文章。 顯示所有文章
顯示具有 Perl 標籤的文章。 顯示所有文章

2013年3月14日 星期四

Perl初學筆記(4)-關於Reference(參照)-2

NOTE:
  • Perl一直到Perl5才出現reference(在perl還沒有reference的概念之前,想要產生二維的陣列是挺困難的),當初為了讓perl5能夠擁有OOP(物件導向/面對對象)的概念,需要有reference的幫助,因此他也叫做物件參考指標。
  • Reference產生很複雜的資料結構 ,對資料的處理有蠻好的彈性。
  • Reference的種類 :
    • 硬性 :
      存記憶體位置(常見)
    • 軟性(aka symbolic reference象徵性參考指標)  :
      用變數名稱作為替代(少見)
  • 參照的寫法:
    • 一般來講reference的變數可以是純量變數,陣列跟雜湊
    • 存取一個變數的作為reference只需要在變數前面加 "\" ,
      • ex:
        %my_hash = qw/name Win want_job Frontend age 24/;
        $ref = \%my_hash
    • 取得reference的值
      • 取得reference的值其實就是取得他在記憶體位置中的內容
      • 要取得reference只需要在變數前面加上被參照的資料型態符號,ex:
        • 以純量作為例子,純量的資料型態符號是$,所以若要取得$scalar的 值只需要在$scalars_reference前面再加一個$
          $$scalars_reference = $scalar;
        • 以陣列作為例子,陣列的資料型態符號是@,所以若要取得$myarray的值只需要在$myarray_ref前面加一個@
          @$myarray  = $myarray;
        • 以雜湊為例子就是
          %$my_hash_ref = %my_hash;
        • 另外以上的三個例子:
           $
          $scalars_reference
          @$myarray
          %$my_hash_ref

          也可以這樣寫.....(加個{ }而已xd)
          $$scalars_reference =  ${$scalars_reference}
          @$myarray                 = @{$myarray }
          %$my_hash_ref        =  %{$my_hash_ref}
      • 常數可以被參考嗎? ans : 可以
Example:取得一個array的reference:
my $ref = \@array;

print "將\@array的參照存在\$ref,print結果:\n";

print $ref."\n";
印出 $ref可得到  ARRAY<0x4c70c8>  -->0x4c70c8就是記憶體位置

Example:怎麼解開參照?   以一個陣列為例,解開參照,並使用陣列取得某個索引值:Ans: 用{}號將reference的變數包起來
my @friends = qw/Tree Bri May/;
my $fri_ref = \@friends;
print @{$fri_ref};

#利用陣列取得某個索引值:
print @{$fri_ref}[2];   #會得到May

Example:以Hash為例,解開參照,請以某個Key來取得值:
my %resume = qw/name Win want_job Frontend age 24/;

my $resume_ref = \%resume;

print ${$resume_ref}{name};        #得到win

print ${$resume_ref}{want_job};  #得到Frontend

print ${$resume_ref}{age};           #得到24

#將%resume當作一般的hash使用for印出

for (keys %{$resume_ref}){
    print ${$resume_ref}{$_}."\n";
}

2013年3月13日 星期三

Perl初學筆記(4)-關於Reference(參照)-1

是說,停頓了幾天沒有寫什麼東西了,一來是忙,二來是我最近也是很不務正業的在看一些Perl的東西,但是...這樣也好啦,因為很可惜的,近期之內 JavaScript應該是不會有什麼進步,偶爾看看別的也好,而且其實我覺得我趁現在身邊同事可以讓我問些問題,也是很不錯。

這兩天有看一些參照的東西,我的朋友有出一個作業讓我寫,挺有趣的,在我以前所學,沒碰過reference這種存在記憶體空間的有趣事情xd,參照的筆記會有兩篇,這篇就先放作業的題目吧! 下一篇可能會寫的比較清楚,而且我發現我的註解比程式碼多好多,呵~有一種又回到一兩年前我剛學PHP那種初學者的感覺。

練習怎麼初始化Hash, Array, Hash的reference, Array的reference:
#!/usr/bin/perl -w
use strict;

my %hash = ();
#這是hash的初始化
#hash的初始化不能用{},否則會報以下的錯誤
#will popup alert msg Reference found where even-sized list expected at practice_hash_array_reference.pl line 5.

my $hash_ref = {};
#這是hash reference的初始化

my @array = () ;
#這是array的初始化

my $array_ref = [];
#這是array reference的初始化

%hash = qw/car audi price 20000000 birth_year 1990/;
#指定一些值到%hash

$hash_ref  = \%hash;
#取得%hash的reference

@array     = (1990...1999);
#指定一些值到@array

$array_ref = \@array;
#取得@array的reference


print "this is \$hash_ref:  $hash_ref \n";
#印出hash reference的記憶體位置
#印出的結果: this is $hash_ref:  HASH(0x162f8bc)

print "this is \$array_ref : $array_ref \n";
#印出array reference的記憶體位置
#印出的結果: this is $array_ref : ARRAY(0x1f5b384)

print "My hash's car is ".${$hash_ref}{car}."\n";
#取得reference的car的值
#印出的結果是: My hash's car is audi

for(keys %{$hash_ref}){
  print "this value is ". ${$hash_ref}{$_}.".\n";
}
#分別印出Hash裡每個value
#印出的結果是:
#this value is audi.
#this value is 1990.
#this value is 20000000.

print @{$array_ref}[2]."\n";
#印出array_ref第二個元素  ==>取得1992

然後...其實Perl的基本語法疑似乎...沒有這麼難理解,他只是符號很多,很簡短,但是要去trace 別人的code,那才是真的亂碼阿xd

2013年3月10日 星期日

Perl初學筆記(3)-關於Hash

今天在家看了一小段的hash
因為我沒有linux的環境,所以我用komodo跟activePerl模擬perl的執行環境
(題外話,說到komodo,前幾天我在家裡試,完全跑不起來,今天不知道怎麼搞的就好了?!)
也正因為這樣,我才有辦法在code寫中文註解,用vim開只會是亂碼xd

ch01.pl
#!/usr/bin/perl -w
use strict;
use Data::Dumper;

#hash是一組純量的集合(hash就是雜湊的意思)
#純量在雜湊中是無序的,也就是須透過key來得到value
#定義一個名為about_win的hash可以這樣寫
#另外雜湊命名以%表示
my %about_win = (
                 'name'=>'Win',
                 'age'=>'24',
                 'job'=>'f2e',
                 'sex'=>'female'
                );
#當然這種key=>value的寫法不是定義hash的唯一方式
#也可以這樣寫
#my %about_win = ('name','win','age','24','job','f2e','sex','female');
#以上的寫法也可以被perl解釋成hash的key跟value,perl會把2N項看成是key(像是0,2,4,6...)

#dump出整個hash
print Dumper \%about_win;

#單獨取出hash的值
print "這是about_win的name: $about_win{name}\n";
print "這是about_win的age: $about_win{age}\n";

#動態增加hash的值
$about_win{is_like_dog}='yes';
print "動態增加一個is_like_dog之後的about_win的Dumper結果是".Dumper \%about_win;

#刪除雜湊的值(value)就是把它清空,讓他釋放記憶體空間
%about_win = ();
print Dumper \%about_win;
#這時dump出來的值就會是空值;



#雜湊和陣列不一樣的是,雜湊沒有按照順序排列
#那要如何知道一個hash有什麼key?
#可以使用Keys(%hash名)取得一個回傳陣列,該陣列會取得該hash裡面的所有key name
my %car = ('label'=>'audi',
           'price'=>'1000000');

print "印出car的key跟value:\n";
while ((my $key, my $value) = each(%car)){
     print $key.", ".$value."\n";
}

#刪除雜湊有兩個方式
(1)delete:一次刪除一個key
(2)undef :刪除整個hash 或是用剛剛提到的%about_win = (); 將hash設定為空值

delete $car{label};
print Dumper \%car;
#結果只剩price

undef(%car);
print Dumper \%car;
#甚麼都沒有了


#如何判斷一個hash有沒有某個key
my %dinner = (
            'food'=>'rice',
            'price'=>'200',
            'drink'=>'green tea'
             );

print exists $dinner{food};
#結果是1 就是true的意思,表示dinner有food這個key



以上ch01.pl的執行結果:
$VAR1 = {
          'name' => 'Win',
          'sex' => 'female',
          'age' => '24',
          'job' => 'f2e'
        };
這是about_win的name: Win
這是about_win的age: 24
動態增加一個is_like_dog之後的
about_win的Dumper結果是$VAR1 = {
          'is_like_dog' => 'yes',
          'name' => 'Win',
          'sex' => 'female',
          'age' => '24',
          'job' => 'f2e'
        };
$VAR1 = {};
印出car的key跟value:
price, 1000000
label, audi
$VAR1 = {
          'price' => '1000000'
        };
$VAR1 = {};
1

Perl初學筆記(2)-關於Dumper

前幾天同事又教我東西了,重點是Perl的Dumper,
Dumper對我來說就是一種debug的東西,可以知道backend傳了什麼變數給f2e,
然後f2e可以知道backend傳了甚麼變數與值給f2e,進而可以做些判斷決定做些甚麼事。

當然我對perl還沒有很熟,只是說, 如果我們可以知道backend定義的某個hash的key跟value,算是一種很不錯的合作模式,如果有什麼判斷不到的事情,f2e可以自己先debug。

然後Dumper就是可以把很複雜或是一般的hash顯示出來,恩... 我自己用起來感覺很像PHP的 print_r或是var_dump,總之很像輸出陣列的感覺。

這個練習其實是從網路上看來的,事情是這樣的這樣子的...
我一直不知道Data:Dumper是Perl本來就有的模組(應該是吧!?)
我看過比方說寫
use AAA::BBB
(use 使用模組的名稱)
(use 使用模組的名稱::使用模組裡面的函式)
,然後我就有辦法找到package AAA:BBB的檔案,或是找到AAA.pm檔之類的。然後我就傻傻地在專案中尋找package是Data::Dumper的檔案,好笑的是,我找不到XD,那應該是在某個特定的路徑下,從cpan或是哪裡下載下來的package吧?!。


好了,不管,總之呢,要使用Dumper就是寫use Data::Dumper;就是了
用的時候可以寫print Data::Dumper->Dump([\%你的hash名稱]);
或是寫print Dumper \%co_worker;




參考:

2013年3月4日 星期一

Perl初學筆記

哼哼,剛好有同事教我的啦,加減學摟!
大部分的題目是練習自歐萊禮的Perl學習手冊裡面的練習題。

取得使用者輸入的值的練習,並且印出Welcome + 人名 :
#!/usr/bin/perl
#thisn is a comment
print "what\'s your name\?";
print "\n";
$line = <STDIN>;
if($line eq "\n"){
    print "nothing";
}else{
    print "Welcome  $line !";
}


執行結果:
[winwu@XXXXX (00:05:44) ~/my_perl]$ perl ch01.pl
what's your name?
win wu
Welcome  win wu


計算圓周長(半徑是12.5):
#!/usr/bin/perl -w
$radius = 12.5;
$pi = 3.141592654;
$circum = $radius*(2*$pi);
print "The circumference is  : $circum";

執行結果:
[winwu@XXXXX (00:13:23) ~/my_perl]$ perl ch02_1.pl
The circumference is  : 78.53981635



檔名 ch02_2.pl(練習第二章的第2跟第3題)
#!/usr/bin/perl -w
print "Please Enter the radius";
print "\n";
$your_radius = <stdin>;
if($your_radius lt 0){
$your_radius = 0;
}
#if the the user enter < 0, than we use 0
$pi = 3.1415926;
$result = $your_radius*(2*$pi);
print "\n"."The Circumference is $result\n";

執行結果:
[winwu@XXXXXXX (00:24:52) ~/my_perl]$ perl ch02_2.pl
Please Enter the radius
12.5
The Circumference is 78.539815



檔名ch02_4.pl(練習第二章的第4題)
讓使用者分別輸入兩個號碼,並且相乘

#!/usr/bin/perl -w
print "Please Enter the First Number\n";
chomp($first_num = <STDIN>);
print "\nPlease Enter the Second Number\n";
chomp($sec_num = <STDIN>);
$result = $first_num*$sec_num;
print "\nThe Result is $result";

執行結果:
[winwu@XXXXXXX (00:32:47) ~/my_perl]$ perl ch02_4.pl
Please Enter the First Number
10
Please Enter the Second Number
20
The Result is 200


檔名 ch02_5.pl(練習第二章的第5題)
#!/usr/bin/perl -w
print "\nPlease Enter an String\n";
$your_str = <STDIN>;
#chomp($your_str);
print "\nPlease Enter an Number\n";
chomp($your_num = <STDIN>);
$result = $your_str x $your_num;
#use X to replace *
print "\n$result";

執行結果:
[winwu@XXXXXX (00:49:12) ~/my_perl]$ perl ch02_5.pl
Please Enter an String
wggw
Please Enter an Number
3
wggw
wggw
wggw

  • 用#!/usr/bin/perl -w時,變數最好要用my宣告
  • windows下可安裝 Komodo IDE來練習Perl

--------------------這是華麗的分隔線---------------



(以下)的練習很多都是參考自簡信昌先生所寫的Perl學習手札而來的:
請參考以上網址,謝謝。

印出'\n' :
#!/usr/bin/perl -w
use strict;

print "\\n";

執行結果:
\n



取出陣列所有大於50的值 :
#!/usr/bin/perl -w
use strict;
my @array = qw/6 -4 8 10 -22  30 40 60 70 60 40 60/;
my @positive = grep{$_>40 } @array;
print "$_\n" for @positive;

執行結果:
[XXXXX@XXXXX (19:26:35) ~/my_perl]$ perl ch201301.pl
60
70
60
60


建立一個陣列(10 15 20 25 30 35),並讓使用者輸入索引值,並且印出陣列中相對應的值:  
#!/usr/bin/perl -w
use strict;
my @array = qw/10 15 20 25 30 35/;
print "Please enter which Key's value you want to see(enter 0~6)?\n";
my $your_value = <STDIN>;
chomp($your_value);
print "the \@array[$your_value] is : \n";
print $array[$your_value]."\n";

執行結果:
[XXXX@XXXXX(19:33:48) ~/my_perl]$ perl ch201301.pl
Please enter which Key's value you want to see(enter 0~6)?
5
the @array[5] is :
35

把這個陣列(4 -4 5 -6 7 -8 9 -10)做排序,並且印出結果 :  
#!/usr/bin/perl -w
use strict;
my @array = qw/4 -4 5 -6 7 -8 9 -10/;
@array = sort @array;
print join ' < ', @array;

執行結果:
[XXXX@XXX (19:41:34) ~/my_perl]$ perl ch201301.pl
-10 < -4 < -6 < -8 < 4 < 5 < 7 < 9



將陣列(4 -4 5 -6 7 -8 9 -10)中所有的值除以2然後print出來:

#!/usr/bin/perl -w
use strict;
my @array = qw/4 -4 5 -6 7 -8 9 -10/;
@array = map{$_/2} @array;
print join "\n", @array;

執行結果:
[XXXXX@XXXXX (19:44:24) ~/my_perl]$ perl ch201301.pl
2
-2
2.5
-3
3.5
-4
4.5


Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...