跳轉到內容

Perl 程式設計/字串

來自 Wikibooks,開放世界中的開放書籍
上一頁:基本變數 索引 下一頁:數字

任何作為單個單元組合在一起的字元序列都是字串。所以,單詞the是一個字串。這句話是一個字串。甚至整個段落都是一個字串。事實上,您可以將本書的全部文字視為一個字串。

字串可以是任何長度,並且可以包含任何字元、數字、標點符號、特殊字元(如! #%),甚至包含英語以外的自然語言中的字元。此外,字串可以包含特殊的空格格式化字元,如換行符、製表符和鈴聲字元。我們稍後將更詳細地討論特殊字元。現在,我們將從考慮如何在 Perl 程式中插入字面字串開始考慮字串。

為了開始我們對 Perl 中字串的討論,我們將考慮如何在 Perl 中使用字串字面量。這裡的單詞字面量指的是當您想要直接在 Perl 中鍵入字串時使用。這可以與將字串儲存在變數中形成對比。

任何字串字面量都可以用作表示式。當我們想要將字串字面量儲存在變數中時,我們會發現這很有用。但是,現在,我們只會考慮可以在 Perl 中建立的不同型別的字串字面量。稍後,我們將學習如何在標量變數部分中將這些字串字面量分配給變數。

單引號字串

[編輯 | 編輯原始碼]

字串字面量主要可以透過三種方式在 Perl 中表示。我們已經在簡單的程式設計示例中使用了一種型別,使用雙引號。在 Perl 中使用雙引號或單引號各有其特殊的含義。

單引號可以被認為是字面字串。在前面的示例中,您可能已經注意到變數名稱包含在用雙引號括起來的字串中。當結果被列印時,變數的值被放置在列印的行中,而不是變數的名稱。如果使用單引號,則會列印實際的變數名,因為使用單引號時,幾乎所有可能以不同方式解釋的特殊字元都按字面值處理。

要了解這是什麼意思,請嘗試以下簡單程式

 my $name = "Fred";
 print "Hello, $name\n";
 print 'Hello, $name\n';

您應該在第一行看到“Hello Fred”,在第二行看到“Hello $name\n”(後面沒有換行符)。將$name放入第一個 print 語句中的字串稱為“插值”。如果您不需要插值,則應該使用單引號,因為它使您的意圖更清晰。

單引號字串中的特殊字元

[編輯 | 編輯原始碼]

單引號字串中有兩個字元並不總是代表自身。這是由於必要性,因為單引號字串以'字元開始和結束。我們需要一種方法來表達在單引號字串內我們希望字串包含一個'字元。

解決此問題的方法是在任何'字元之前加上反斜槓(\字元),我們實際上希望它出現在字串本身中。因此,我們有這樣的字串

  'xxx\'xxx';  # xxx, a single-quote character, and then xxx

在這個例子中,我們恰好有一個包含七個字元的字串。即,這是字串xxx'xxx。一開始可能難以適應 Perl 的輸入中的兩個字元實際上只在字串本身中產生一個字元的想法。(C 程式設計師可能已經習慣了這個想法。)但是,只要記住規則,您可能會很快習慣它們。

由於我們已經使用\字元對'字元執行了一些特殊操作,因此我們現在必須擔心反斜槓字元本身的特殊情況。當我們在單引號字串中看到一個\字元時,我們必須仔細考慮會發生什麼。

在大多數情況下,當\在單引號字串中時,它只是一個反斜槓,代表它自己,就像大多數其他字元一樣。但是,以下例外情況適用

  • 序列\'在實際字串中產生字元'。(這是我們上面已經討論過的例外情況)。
  • 序列\\在實際字串中產生字元\在實際字串中。換句話說,兩個彼此相鄰的反斜槓實際上只產生一個反斜槓。
  • 反斜槓本身不能放在單引號字串的末尾。這不可能發生,因為 Perl 會認為您正在使用\轉義結束的'.

以下示例說明了各種例外情況,並正確地使用了它們

  'I don\'t think so.';          # Note the ' inside is escaped with \
  'Need a \\ (backslash) or \?'; # The \\ gives us \, as does \
  'You can do this: \\';         # A single backslash at the end
  'Three \\\'s: "\\\\\"';        # There are three \ chars between ""

在最後一個示例中,請注意結果字串為Three \'s: "\\\"。如果您能理解該示例,那麼您肯定已經掌握了單引號字串的工作原理!

除了難以閱讀的反斜槓轉義之外,Perl 還提供了其他方法來引用字串。上面的第一個示例可以寫成

  q{I don't think so};            # No \ needed to escape the '

單引號字串中的換行符

[編輯 | 編輯原始碼]

請注意,沒有規則禁止單引號字串跨越多行。當您這樣做時,字串中嵌入了換行符

換行符是一個特殊的 ASCII 字元,表示應開始新行。在文字編輯器中或將輸出列印到螢幕上時,這通常表示游標應從當前行的末尾移動到其後一行的第一個位置。

由於 Perl 允許將這些換行符直接放置到單引號字串中,因此我們可以執行以下操作

  'Time to
  start anew.';   # Represents the single string composed of:
                  # 'Time to' followed by a newline, followed by
                  # 'start anew.'

此字串共有二十個字元。前七個是Time to。下一個字元是換行符。然後是十一個字元,start anew.跟隨。再次注意,這是一個字串,其第八個字元是換行符。

此外,請注意,我們不允許在字串中間放置註釋,即使我們通常允許在行的任何位置放置#並將該行其餘部分作為註釋。我們不能在這裡這樣做,因為我們還沒有用'終止我們的單引號字串,因此,任何#字元和其後的註釋實際上都會成為單引號字串的一部分!請記住,單引號字串以'開頭,以'結尾,介於兩者之間的所有內容都被視為字串的一部分,包括換行符、#字元和其他任何內容。

無效單引號字串示例

[編輯 | 編輯原始碼]

在完成我們對單引號字串的討論時,請考慮以下這些合法的字串示例,因為它們違反了我們上面討論的例外情況

  'You cannot do this: \'; # INVALID: the ending \ cannot be alone
  'It is 5 o'clock!'       # INVALID: the ' in o'clock should be escaped
  'Three \\\'s: \\\\\';      # INVALID: the final \ escapes the ', thus
                           #          the literal is  not terminated
  'This is my string;      # INVALID: missing close quote

有時,當您有如上例所示的無效字串字面量時,Perl 給出的錯誤訊息不是特別直觀。但是,當您看到諸如

 (Might be a runaway multi-line '' string starting on line X)
 Bareword found where operator expected
 Bareword "foo" not allowed while "strict subs" in use

之類的錯誤訊息時,這通常表示您有失控或無效的字串。注意這些問題。很有可能,您最終會忘記並違反單引號字串的規則之一,然後需要確定為什麼無法執行您的 Perl 程式。

僅從字串中簡要討論:print

函式

[編輯 | 編輯原始碼]

在我們繼續討論雙引號字串之前,有必要先進行一個小小的偏離。我們知道如何在 Perl 中表示字串,但是,您可能已經注意到,我們迄今為止給出的示例並沒有做任何有趣的事情。如果您嘗試將我們列為示例的語句放入單引號字串中,像這樣

 #!/usr/bin/perl
 use strict;
 use warnings;
 'Three \\\'s: "\\\\\"'; # There are three \ chars between ""
 'xxx\'xxx';             # xxx, a single-quote character, and then xxx
 'Time to
 start anew.';

您可能注意到沒有任何有趣的事情發生。Perl 很樂意執行此程式,但它不會產生任何輸出。

因此,為了開始在 Perl 中處理字串,超越簡單的假設考慮,我們需要一種方法讓 Perl 為我們顯示我們的字串。在 Perl 中實現此目的的規範方法是使用print

函式。

Perl 中的print

函式可以以多種方式使用。最簡單的形式是使用語句print STRING;,其中STRING是任何有效的 Perl 字串。

因此,為了重新考慮我們的示例,我們可以打印出每個字串,而不是簡單地列出它們

 #!/usr/bin/perl
 use strict;
 use warnings;
 print 'Three \\\'s: "\\\\\"'; # Print first string
 print 'xxx\'xxx';             # Print the second
 print 'Time to
 start anew.
 ';    # Print last string, with a newline at the end

此程式將產生輸出。執行時,輸出將傳送到所謂的標準輸出。這通常是您執行 Perl 程式的終端、控制檯或視窗。對於上面的程式,標準輸出的輸出如下

 Three \'s: "\\\"xxx'xxxTime to
 start anew.

請注意,需要換行符來分隔行。因此,如果您希望您的字串成為輸出中該行的最後一項,則需要在每個有效字串的末尾新增換行符。

請注意,在輸出的最後一個字串的末尾放置換行符尤其重要。如果不這樣做,通常您正在使用的命令直譯器的命令提示符可能會與您的最後一行輸出合併在一起,這可能會令人非常困惑。因此,始終記住在每行的末尾放置換行符,尤其是在輸出的最後一行。

最後,您可能已經注意到,在單引號字串中間使用換行符來格式化程式碼會損害可讀性。因為您在單引號字串內,所以您無法更改 print 語句中續行的格式,也無法在這些行的末尾添加註釋,因為這會將資料插入到您的單引號字串中。為了更優雅地處理換行符,您應該使用雙引號字串,這是下一節的主題。

雙引號字串

[編輯 | 編輯原始碼]

雙引號字串是表示 Perl 中標量字串字面量的另一種方式。與單引號字串一樣,您將一組 ASCII 字元放在兩個分隔符之間(在本例中,我們的分隔符是")。但是,當您使用雙引號字串時,會發生稱為插值的操作。

雙引號字串中的插值

[編輯 | 編輯原始碼]

插值是一個特殊的處理過程,其中用 ASCII 編寫的某些特殊字串被替換為不同的內容。在單引號字串部分中,我們注意到單引號字串中的某些序列(即,\\\')被不同地處理 - 這些稱為反斜槓轉義序列。這與插值發生的情況非常相似。

例如,在插值的雙引號字串中,各種以\字元開頭的序列根據下表中的內容進行不同的處理

字串 插值為
\\ 一個實際的單個反斜槓字元
\$ 一個單個 $ 字元
\@ 一個單個 @ 字元
\" 一個單個雙引號字元
\t 製表符
\n 換行符
\r 回車
\f 換頁
\b 退格
\a 警報(鈴聲)
\e 轉義
\056 由八進位制值表示的字元,056(與.)
\x2E 由十六進位制值表示的字元,2E(與.)

您可能在上一章中已經注意到,您可以在字串中放置變數的名稱及其前導美元符號。這種形式的插值將字串中變數的名稱替換為變數的內容。

插值的示例

[編輯 | 編輯原始碼]

讓我們考慮一個使用其中幾個字元的示例

 #!/usr/bin/perl
 use strict;
 use warnings;
 print "A backslash: \\\n";
 print "Tab follows:\tover here\n";
 print "Ring! \a\n";
 print "Please pay someone\@example.org \$20.\n";

此程式執行時,會在螢幕上產生以下輸出

 A backslash: \
 Tab follows:	over here
 Ring!
 Please pay someone@example.org $20.


此外,執行時,您應該聽到計算機發出蜂鳴聲。那是\a字元的輸出,您無法在螢幕上看到它。但是,您應該能夠聽到它。

請注意,\n字元結束一行。\n應始終用於結束一行。熟悉 C 語言的學生習慣於使用此序列來表示換行符。在編寫 Perl 時,換行符一詞和\n字元大致同義。

字串運算子

[編輯 | 編輯原始碼]

運算子以某種方式操作兩個或多個字串。

連線運算子

[編輯 | 編輯原始碼]

Perl 使用.運算子連線或連線兩個字串,如下所示

"Hello" . "World"  # This is the same as "HelloWorld"

如果您希望字串在 Hello 和 World 之間有一個空格,您可以這樣編寫

"Hello" . ", " . "World"  # This is the same as "Hello, World"

或者像這樣

"Hello" . ", World" # This is the same as "Hello, World"

Perl 中的x運算子

[編輯 | 編輯原始碼]

這稱為字串重複運算子,用於重複字串。您只需將字串放在x左側,並將數字放在右側即可。像這樣

"Hello" x 5 # This is the same as "HelloHelloHelloHelloHello"

如果您希望在每次輸出字串後插入換行符,請使用

"Hello\n" x 5
  • 編寫一個使用.運算子列印“Hello, Sir!”的程式。
  • 編寫另一個使用x運算子列印“HelloHelloHelloHello”的程式。在此程式中添加註釋以解釋其工作原理
  • 請記住,花些時間練習使用單引號和雙引號字串,練習得越多,您就會越熟練。
上一頁:基本變數 索引 下一頁:數字
華夏公益教科書