Perl的數值和字符串

數值和字符串

數值

  • perl中以雙精度(浮點數)方式保存和運算數值的方式

就算寫的是整數,在內部也會轉換成等效的浮點數類型保存。shell

但在perl內部,有些運算會將浮點數轉換成整型進行,並且也有integer編譯器能夠強制編譯成整型。函數

  • perl中整數的表示方式

有3種方式:操作系統

123
0123
61_123_234

這裏使用下劃線(_)代替逗號表示千分位,由於perl中逗號有特殊意義。code

  • 算術運算
+ - * / % **

**的優先級在這裏最高。文檔

取模時,先兩個數取整,再取模。例如5.2 % 2.1等價於5 % 2字符串

多個取冪符號時,**的優先級是從右向左進行的。編譯器

3 ** 4 ** 2   # 3 ** (4 ** 2) = 3的16次方

單雙引號和反引號

perl對待單雙引號的方式和shell有點相似。編譯

  • 單引號內,只有反斜線的轉義效果存在(如\n再也不是換行),其它全都看成字面符號(單引號自身除外)
  • 雙引號內,反斜線、反斜線序列(\n,\t...)、變量替換都容許
  • 反引號內,內容會交給shell執行
'malong'
'malong\'s girl friend'
'malong\n'               # 這裏沒有換行
"malong\n"               # 換行了
'malong
girl friend'             # 換行了,由於這裏的換行是字面符號,不是\n
'malong\\n'              # 換行了
"malong $var"            # 變量替換

有如下反斜線序列(轉義序列):變量

\n
\r
\t
\l    # 將下個字母轉換爲小寫
\L    # 將後面的多個字母都轉換爲小寫,直到遇到\E
\u    # 將下個字母轉換爲大寫
\U    # 將後面的多個字母都轉換爲大寫,直到遇到\E
\Q    # 和\E之間的全部字符都強制看成字面符號
\E    # \L、\U和\Q的結束符號

但即便沒有"\E",到了字符串結束的地方,轉義序列就會結束。例如:date

print "\Uabc"."xyz\n"    # 輸出ABCxyz
print "abc"."x\Eyz\n"    # 輸出abcxyz

反引號內的字符串會交給shell執行。這是和操做系統交互的一種方式,支持操做系統的管道、重定向等特性。另外一種方式是使用system函數。

$mydatetime = `date +"%F %T"`
print $mydatetime,"\n";

默認狀況下,反引號內的內容會被perl先按照雙引號的方式進行解析,而後傳遞給操做系統的shell執行。因此,當有變量替換時會進行變量替換:

$name="malongshuai";
$msg=`echo $name`;   # 替換爲echo malongshuai,而後交給shell
print $msg;

若是不想先被perl解析,可使用qx和單引號結合的方式,關於qx,見下文。

$name="malongshuai";
$msg=qx'echo ha $name hei';   # 不會替換爲malongshuai,而是將$name替換爲空交給shell
print $msg;

引號的文本形式:q、qq和qx

  • q等價於單引號
  • qq等價於雙引號
  • qx等價於反引號
q(hello world)        # 等價於'hello world'
qq(hello world)       # 等價於"hello world"
qx(echo hello world)  # 等價於`echo hello world`

上面的括號能夠替換爲其它符號,只要先後能配對(特指括號類)或者一致便可:

qq{ hello }
qq! hello !
qq# hello #
qq% hello %

字符串鏈接和重複

字符串鏈接使用點(.)。

下面是等價的:

abc.cde
abccde

字符串重複使用小寫字母"x",後跟一個重複倍數。若是倍數是一個小數,如3.2,則會取整。若是倍數小於1,則取整爲0,因此倍數爲0,返回空。

"abc" x 3
"abc" x 3.2

都將輸出"abcabcabc"。

"abc" x 0.4  # 返回空

"x"符號左邊會強制轉換爲字符串。

03 x 3      # 返回333
"03" x 3    # 返回030303
3 x 3       # 返回333
3.2 x 3     # 返回3.23.23.2

數值和字符串的類型自動轉換

何時轉換,以及向哪一個方向轉換,取決於操做符。

例如,算數運算符(+-*/等)須要的是數值,會強制轉換爲數值。"."操做符須要的是字符串,會強制轉換爲字符串。

"0333" + 22  # 返回355
"033".22     # 返回03322
033.22       # 返回2722,033表示8進制,轉換爲十進制爲27(3*8+3)

perl變態的一個地方,數值開頭的字符串也能夠強制轉換爲字符串。但只能轉換數值開頭(容許前導空白)的字符串。

"12abc" * 3      # 36
"abc12" * 4      # 0
"  12abc" * 3    # 36

兩種類型的操做符一塊兒用的時候,會按照優先級進行運算:

"abc".5*3        # 返回abc15,乘法先運算
"abc".5 + 3      # 返回3,"."先運算
"abc".(5+3)      # 返回abc8

heredoc

perl中也支持heredoc,所謂heredoc,即表示將後面的內容看成文檔。既然是文檔,就須要有文檔起始符和文檔結束符,分別標識文檔從哪裏起始,到哪裏結束。

通常來講,全部支持heredoc的語言,文檔起始符和文檔結束符都必須相同(通常使用EOF或eof做爲起始符和結束符),且結束符必須單獨佔行且頂格書寫。

perl中支持的heredoc格式以下,以print爲例:

print <<EOF;
    line1
    line2
    line3
EOF
  • 這裏以EOF做爲文檔起始符和結束符
  • 起始符EOF後面必須加上分號結尾,分號後的全部內容都忽略(即便它後面的不是註釋內容)
  • 結束符EOF單獨佔用一行,且頂格書寫
  • 起始符和結束符中間是怎樣的數據,輸出時就是怎樣的數據

perl的heredoc還有本身的特性,能夠爲起始符加上單引號和雙引號以及其它符號。加單雙引號後的效果和通常單引號、雙引號的能力是同樣的:

  • 單引號是強引用
  • 雙引號是弱引用
  • 不加引號等價於加雙引號
  • 加反引號`,則將字符串放進shell環境執行

加單雙引號:

$name="malongshuai";
 
print <<'EOF';
        haha
        \$name  # 反斜線轉義功能失效
        
        $name   # 變量沒法替換
EOF

print <<"EOF";
        haha
        \$name   # 反斜線成功轉義
        
        $name    # 變量成功替換
EOF

加反引號:

print <<`EOF`;
        date +"%F %T"
EOF

能夠將heredoc直接賦值給變量:

$msg = <<EOF;
    HELLO
    WORLD
EOF

print $msg;  # $msg不要加換行符,由於$msg是一個heredoc,自帶換行符
相關文章
相關標籤/搜索