scan(3tcl) Tcl Built-In Commands scan(3tcl)

scan - 使用 sscanf 式樣的轉換指定符分析字串

總覽 SYNOPSIS

scan string format ?varName varName ...?

這個命令用與 ANSI C sscanf 過程相同的方式從輸入字串中分析欄位並返回完成的轉換數目的總計,如果在任何轉換被完成之前到達了輸入字串的結束則返回 -1。String 給出要被分析的輸入而 format 指示如何分析它,使用與 sscanf 相同的 % 轉換指定符。每個 varName 給出一個變數的名字;在從 string 中檢索出一個欄位的時候,結果被轉換回一個字串並賦值給相應的變數。 如果未指定 varName 變數,則 scan 在行內(inline)方式下工作,返回的資料將是一個列表而不儲存在變數中。在行內方式下,如果在任何轉換被完成之前到達了輸入字串的結束則返回,則返回一個空串。

檢索細節 DETAILS ON SCANNING

Scan 操作一起檢索 stringformat。如果在 format 的下一個字元是一個空字元(blank)或跳格字元(tab)則它匹配在 string 中任何數目(包括零個)的白空格字元。 如果它不是一個 % 字元則它必須匹配 string 的下一個字元。當在 format 中遇到一個 % 的時候,它指示一個轉換指定符的開始。 一個轉換指定符包括 % 和後面的最多四個欄位: 一個 *,它指示丟棄被轉換出的值而不是賦值到變數中;一個 XPG3 位置指定符;一個數指示最大的欄位寬度;和一個轉換字元。除了轉換字元之外所有這些欄位都是可選的。存在的欄位必須按照上面給出的次序出現。

scanformat 中發現一個轉換指定符的時候,它首先跳過 string 中的所有白空格(除非指定符是 [c)。接著它依據轉換指定符轉換下一組輸入字元,並把結果儲存到用給 scan 的下一個引數給出的變數中。

如果 % 跟隨著一個十進位制數和一個 $,比如``%2$d'',則使用的變數不取自下一個順序的引數。而是取自用這個數字指定的引數,這裡 1 對應著第一個 varName。如果在 format 中有任何位置指定符則所有指定符都必須被指定位置。每個在引數列表上的 varName 必須準確的對應於一個轉換指定符,否則生成一個錯誤。在行內方式下,任何位置指定符可以指定最多一次,並且用空串填充空位置指定符。

支援下列轉換字元:

輸入欄位必須是一個十進位制整數。它被讀入並作為一個十進位制字串儲存到變數中。
輸入欄位必須是一個八進位制整數。它被讀入並作為一個八進位制字串儲存到變數中。 If the value exceeds MAX_INT (017777777777 on platforms using 32-bit integers), it will be truncated to a signed integer. Hence, 037777777777 will appear as -1 on a 32-bit machine.
輸入欄位必須是一個十六進位制整數。它被讀入並作為一個十六進位制字串儲存到變數中。 If the value exceeds MAX_INT (0x7FFFFFFF on platforms using 32-bit integers), it will be truncated to a signed integer. Hence, 0xFFFFFFFF will appear as -1 on a 32-bit machine.
輸入欄位必須是一個十進位制整數。它被讀入並作為一個無符號十進位制字串儲存到變數中。
輸入欄位必須是一個整數。使用與 expr 中描述的相同方式確定基數(base)(例如,十進位制、八進位制、或十六進位制)。值被作為一個十進位制字串儲存到變數中。
讀入一個單一的字元並把它的二進位制值作為一個十進位制字串儲存到變數中。在這種情況下不跳過初始的白空格,這樣輸入欄位可以是一個白空格字元。這個轉換不同於 ANSI 標準的地方是輸入欄位總是由一個單一欄位組成並且不可以指定欄位寬度。
輸入欄位由到下一個白空格為止的所有字元組成;把這些字元複製到變數中。
輸入欄位必須是一個浮點數,其組成是一個可選的正負號,一個可能有小數點的十進位制數字的字串,和一個可選的指數,它由一個 eE 並跟隨著一個可選的正負號和一個十進位制數字的字串組成。它被讀入並作為一個浮點數儲存到變數中。
[chars]
輸入欄位由任何數目的在 chars 中的字元組成。把匹配的字串儲存到變數中。如果在方括號之間的第一個字元是] 則它被作為 chars 的一部分來對待而不是這個字元集合的閉合方括號。 如果 chars 包括一個 a-b 形式的序列,則匹配在 ab 之間(包括二者)的任何字元。如果在方括號之間的第一個或最後一個字元是一個 -,則它被作為 chars 的一部分來對待而不是指示一個範圍。
[^chars]
輸入欄位由任何數目的不在 chars 中的字元組成。把匹配的字串儲存到變數中。如果緊隨在 ^ 後面的字元是一個 ] 則它被作為 chars 的一部分來對待而不是這個字元集合的閉合方括號。 如果chars 包括一個 a-b 形式的序列,則從字元的集合中排除在 ab 之間(包括二者)的任何字元。如果在方括號之間的第一個或最後一個字元是一個 -,則它被作為 chars 的一部分來對待而不是指示一個範圍。
不從輸入字串中消耗輸入。而是把到現在為止從輸入字串中檢索到的字元總數儲存到變數中。

對於一個轉換從輸入中讀的字元數目應該是對特定轉換最大的數目(例如,對 %d 是儘可能多的十進位制數字,對於 %o 是儘可能多的八進位制數字,以此類推)。給一個給定轉換的輸入要麼終止於遇到一個白空格要麼終止於達到了最大的欄位寬度,只要其中一種情況滿足就終止。如果在轉換指定符中存在一個 * 則不賦值變數並且不消耗下一個檢索引數。

與ANSI SSCANF 的區別 DIFFERENCES FROM ANSI SSCANF

除了下列區別之外 scan 命令的行為與 ANSI C sscanf 過程的行為相同:

[1]
當前不支援 %p 轉換指定符。
[2]
對於 %c 轉換,把一個單一字元轉換成一個十進位制字串,接著把它賦值給相應的 varName;對於這個轉換不能指定欄位寬度。
[3]
忽略 lh、和 L 修飾符;轉換整數值總是如同不存在修飾符,而轉換實數值總是如同存在 l 修飾符(就是說,對於內部表示使用型別 double)。
[4]
如果在任何轉換被完成之前到達了輸入字串的結束並且未給出變數,則返回一個空串。

參見 SEE ALSO

format(n), sscanf(3)

關鍵字 KEYWORDS

conversion specifier, parse, scan

寒蟬退士

2001/11/07

《中國 Linux 論壇 man 手冊頁翻譯計劃》:

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

8.3 Tcl