Perl (二) 變數類型

Perl 入門:
  1)純量變數 (scalar variable):符號 $,內容可以是整數、小數、字串單引號或雙引號括住,雙引號括住裏面可帶變數或脫逸字元。

$n1 = 25;                        # 25
$n2 = 2.5;                       # 2.5
$s1 = "There are $n1 dollars.\n" # 雙引號字串
$s2 = 'There is no spoon.';      # 單引號字串

  2)陣列變數 (array variable):符號 @,其字面常數為用小括弧圍起來的資料,可使用 .. 運算子表示某一定範圍的值
@array = (1, 2.0, 'spoon'); # 三個元素的陣列
@10 = (1 .. 10);            # 從 1 到 10 的陣列
@alph = ("a" .. "z");       # 小寫英文字母表陣列
@days = qw/Monday
Tuesday
Wednesday
Thursday
Firday
Saturday
Sunday/;                    # 星期一到星期天的英文單字陣列
### 上面@days 用了另一種運算子 qw/值/,這會將//範圍內的文字以官白字元拆開成字串放置到陣列內,等同於:
@days2 = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Firday', 'Saturday', 'Sunday');
### 字串的取值可以用中括弧加索引值,索引值由0遞增,如:
@array = (1, 2.0, 'spoon'); 
print $array[0]; # 印出 1
print $array[1]; # 印出 2
print $array[2]; # 印出 spoon

  3)雜湊變數 (hash variable):符號 %,雜湊變數則是一種 key-value 配對的資料型態,例如
%ages = ('Tony' => 28,
         'John' => 35,
         'Mary' => 29);
### 其中Tony' 、 'John' 、 'Mary' 為 key , 28 、 35 、 29 各是所屬的 value ,存取元素則利用中括弧加 key 值
print $ages{'Tony'}; # 印出 28
print $ages{'John'}; # 印出 35
print $ages{'Mary'}; # 印出 29

#!/usr/bin/env perl
#

# 基本語法
# ;用於語句結束符
# #用於註釋
# ""用於表示字符串,變數可以在""中被替換,如:
$var = "world.";
print "Hello $var\n"; #輸出為:Hello world.
# ''用於表示字符串,''內的所有內容都被當作純文本,如:
print 'Hello $var\n'; #輸出為:Hello $var\n
# 關於style
print("Hello, world\n"); #OK
print "Hello, world\n";  #OK


# 變數類型
# Perl主要有三種變數類型: 純量變數、純量陣列、hash陣列、指標
# Perl不需要預先聲明變數,直接將變數值附給變數即可
# 標量表示單一值,以$後接變數名來表示一個標量
# 標量可以存儲字符串、整數、浮點數
$var_scalar = 1;
print $var_scalar;
# 或者
print "The scalar's value is $var_scalar\n";
print "The scalar's value is", $var_scalar, "\n";
# 用@後接變數名來表示一個陣列
# 陣列保存列表,列表是標量集合
@var_array = (1, 2, 3, "a", "b", "c");
# 或者
@var_array = qw(1 2 3 a b c);
@var_array = qw/1 2 3 a b c/;
print "The 2nd elm of var_array is $var_array[1]\n";
# 陣列切片
# 1. 輸出陣列中某兩個值
print @var_array[0, 2], "\n";
# 2. 用連接符..輸出陣列中一個區間中的所有值
print @var_array[0..3], "\n";
# 用%後接變數名表示一個hash,即"鍵值對"的集合
# = >符號左邊是鍵,右邊是值
%var_hashes = (a => "Apple", b => "Blizzard");
print "One elm of var_hashes is $var_hashes{\"b\"}\n";
# 用keys()或values()兩個函數分別獲取hash表的所有鍵或所有值
my @allKeys = keys %var_hashes;
my @allValues = values %var_hashes;

# 常用內建變數
# $_ 默認變數
# @_ 默認陣列變數,保存傳遞給子程序的所有參數
# $! 當前錯誤信息
# $0 當前腳本的文件名
# $$ 當前腳本的進程號
# @ARGV 命令行參數列表


# 內建操作符和操作函數
### 數值運算子
# +, -, *, /    
# ==, !=, <, >, <=, >= 
# +=, -=, *=    
# &&, and     
# ||, or     
# != not     
# = 附值    
# % 取餘數    
# < = > 如果左邊大於右邊返回-1,否則 +1
# ++, --, **    
# ^      
### 字串運算子
# eq  equality   
# ne  inequality
# lt  less than
# gt  greater than
# le  less than or equal
# ge  greater than or equal
# . 串連兩個字符串
# x 重複字符串
# .. 以..符號相端點,創建一串值
print "Baidu"x3;
print "\n";

# 變數作用域
# 主要有my和local兩種作用域
# my,聲明的層次&同一層次
# local, 聲明的層次&以內層次
my $var_my_scope;
local $var_local_scope;
# 不加my或local,默認為全局作用域 
# !建議不要用過多全局的變數
# !建議在腳本開頭加上如下兩句:
use strict;
use warnings;
# 這樣,解釋器會強制你使用my或local來表示變數的作用域,
# 這樣做可以幫你檢查到一些普通的編程錯誤


# 條件判斷和循環控制
# if, while, for, foreach,until, unless
# if
my $isOK = 1;
if ($isOK) { # ()和{}在這裡都是必須使用的
 print "OK\n";
} else {
 print "Ooops...\n";
}
# 或者這樣寫:
print "OK\n" if $isOK;
# while
my $count = 10;
while($count > 0) {
 print "while ... $count\n";
 $count -= 1;
}
# 因為foreach的存在,for在Perl中用得很少,它的寫法和C一樣
my @array = (1, 2, 3, "a");
foreach my $elm (@array) {
 print $elm, "\n";
}


# 文件操作,即IO
# open()函數打開一個文件
# 讀文件$file,將文件的標識符附給$fileHandle
my $file2open="./1.txt";
my $fileHandle;
open($fileHandle, "<$file2open");
# <>符號用於讀取$fileHandle指向的內容
# 利用鑽石操作符號<>,你可以:
# 1. 將$fileHandle指向的內容附給一個標量,這樣只讀一行就over
# my $line = <$fileHandle>;
# 2. 將$fileHandle指向的內容附給一個陣列,將每一行作為一個element
# my @lines = <$fileHandle>;
# 3. 常用於while或者foreach
foreach (<$fileHandle>) { 
 print $_;
}
# 寫文件$file
open($fileHandle, ">$file2open");
print $fileHandle "abc";
# 追加寫入
open($fileHandle, ">>$file2open");
print $fileHandle "def";
# 關閉文件
close($fileHandle);


# 子程序
# @_ 符號包含所有傳遞給子程序的參數
sub subFunc1 {
 print "\nsubroutine 1\n";
}
sub subFunc2 {
 print "subroutine 2\n";
 return "I like Perl.\n";
}
sub subFunc3 {
 my ($param1, $param2) = @_;
 print $param1, $param2, "\n";
}
# calling subroutine
subFunc1();
# 或者
&subFunc1;
print subFunc2(); 
subFunc3("Ooops...", 123);


# 正則表達式
# 查找:在$re_test中查找oo
# =~是綁定操作符
my $re_test = "Google";
if($re_test =~ /oo/) {
 print "Bingo!\n";
}
# 替換;在$re_test中用xx替換oo
if($re_test =~ s/oo/xx/){
 print $re_test, "\n";
}
# 匹配修飾符
# i, g
my $re_test2 = "FacebOok";
if($re_test2 =~ /oo/i){
 print "Bingo!\n";
}

0 意見:

張貼留言