內容

名稱

Term::ANSIColor - 使用 ANSI 逃逸序列為螢幕輸出著色

語法

use Term::ANSIColor;
print color('bold blue');
print "This text is bold blue.\n";
print color('reset');
print "This text is normal.\n";
print colored("Yellow on magenta.", 'yellow on_magenta'), "\n";
print "This text is normal.\n";
print colored(['yellow on_magenta'], 'Yellow on magenta.', "\n");
print colored(['red on_bright_yellow'], 'Red on bright yellow.', "\n");
print colored(['bright_red on_black'], 'Bright red on black.', "\n");
print "\n";

# Map escape sequences back to color names.
use Term::ANSIColor 1.04 qw(uncolor);
my @names = uncolor('01;31');
print join(q{ }, @names), "\n";

# Strip all color escape sequences.
use Term::ANSIColor 2.01 qw(colorstrip);
print colorstrip("\e[1mThis is bold\e[0m"), "\n";

# Determine whether a color is valid.
use Term::ANSIColor 2.02 qw(colorvalid);
my $valid = colorvalid('blue bold', 'on_magenta');
print "Color string is ", $valid ? "valid\n" : "invalid\n";

# Create new aliases for colors.
use Term::ANSIColor 4.00 qw(coloralias);
coloralias('alert', 'red');
print "Alert is ", coloralias('alert'), "\n";
print colored("This is in red.", 'alert'), "\n";

use Term::ANSIColor qw(:constants);
print BOLD, BLUE, "This text is in bold blue.\n", RESET;

use Term::ANSIColor qw(:constants);
{
    local $Term::ANSIColor::AUTORESET = 1;
    print BOLD BLUE "This text is in bold blue.\n";
    print "This text is normal.\n";
}

use Term::ANSIColor 2.00 qw(:pushpop);
print PUSHCOLOR RED ON_GREEN "This text is red on green.\n";
print PUSHCOLOR BRIGHT_BLUE "This text is bright blue on green.\n";
print RESET BRIGHT_BLUE "This text is just bright blue.\n";
print POPCOLOR "Back to red on green.\n";
print LOCALCOLOR GREEN ON_BLUE "This text is green on blue.\n";
print "This text is red on green.\n";
{
    local $Term::ANSIColor::AUTOLOCAL = 1;
    print ON_BLUE "This text is red on blue.\n";
    print "This text is red on green.\n";
}
print POPCOLOR "Back to whatever we started as.\n";

說明

此模組有兩個介面,一個是透過 color() 和 colored(),另一個是透過常數。它也提供 uncolor()、colorstrip()、colorvalid() 和 coloralias() 等工具函式,必須明確匯入才能使用 (請參閱 "語法")。

如果您在主控台指令中使用 Term::ANSIColor,請考慮支援 CLICOLOR 標準。有關更多資訊,請參閱 "支援 CLICOLOR"

請參閱 "相容性",了解 Term::ANSIColor 引入特定功能的版本,以及包含這些功能的 Perl 版本。

支援的顏色

支援顏色的終端機模擬器可分為四種類型:僅支援八種顏色的類型、支援十六種顏色的類型、支援 256 種顏色的類型,以及支援 24 位元顏色的類型。這個模組提供所有這些類型的 ANSI 逸出碼。這些顏色稱為 ANSI 顏色 0 到 7(一般)、8 到 15(16 色)、16 到 255(256 色),以及真彩色(xterm 稱為直接色彩)。

不幸的是,顏色 0 到 7 的詮釋通常取決於模擬器是否支援八種或十六種顏色。僅支援八種顏色的模擬器(例如 Linux 主控台)會以一般亮度顯示顏色 0 到 7,並忽略顏色 8 到 15,將它們視為白色。支援 16 種顏色的模擬器,例如 gnome-terminal,通常會將顏色 0 到 7 顯示為暗淡或較暗的版本,並將顏色 8 到 15 顯示為一般亮度。在這些模擬器上,「一般」白色(顏色 7)通常顯示為淡灰色,需要使用亮白色(15)才能獲得真正的白色。亮黑色通常是深灰色,儘管有些終端機將其顯示為純黑色。有些十六色終端機模擬器也會將一般黃色(顏色 3)視為橘色或棕色,並將亮黃色(顏色 11)視為黃色。

遵循十六色模擬器的慣例,這個模組為每種顏色提供一對屬性。對於每個一般顏色(0 到 7),對應的亮顏色(8 到 15)是透過在一般顏色名稱前面加上字串 bright_ 來取得。例如,red 是顏色 1,而 bright_red 是顏色 9。背景顏色也適用相同的規則:on_red 是一般顏色,而 on_bright_red 是亮顏色。將這些字串大寫以用於常數介面。

不幸的是,沒有辦法知道目前的模擬器是否支援超過八種顏色,這使得顏色的選擇變得困難。最保守的選擇是僅使用一般顏色,這些顏色至少會顯示在所有模擬器上。但是,它們會在十六色終端機模擬器中顯示為暗色,包括 UNIX X 環境中最常見的模擬器。如果您知道顯示器是這些模擬器之一,您可能希望改用亮色變體。更好的做法是提供使用者一種方式來設定特定應用程式的顏色以符合他們的終端機模擬器。

對於 256 色模擬器,此模組另外提供 ansi0ansi15,這些與十六色模擬器中的顏色 0 到 15 相同,但使用 256 色跳脫語法,grey0grey23 範圍從近乎黑色到近乎白色,以及一組 RGB 色彩。RGB 色彩的格式為 rgbRGB,其中 RGB 是 0 到 5 之間的數字,表示紅色、綠色和藍色的強度。如果您想要所有 256 種顏色的簡單名稱,則灰色和 RGB 色彩也可作為 ansi16ansi255 使用。這些顏色的 on_ 變體也已提供。這些顏色可能會在非 256 色終端機上完全被忽略,或者可能被誤解並產生隨機行為。閃爍、斜體或粗體等其他屬性可能無法與 256 色調色板搭配使用。

對於真彩色模擬器,此模組支援 rNNNgNNNbNNNon_rNNNgNNNbNNN 形式的屬性,其中 NNN 的所有值介於 0 到 255 之間。這些分別代表前景和背景顏色,RGB 值由 NNN 數字給出。這些顏色可能會在非真彩色終端機上完全被忽略,或者可能被誤解並產生隨機行為。

函數介面

函數介面使用屬性字串來描述要指定給文字的顏色和文字屬性。已識別的非顏色屬性為清除、重設、粗體、深色、淡色、斜體、底線、下底線、閃爍、反白和隱藏。清除和重設(重設為預設屬性)、深色和淡色(暗淡和飽和),以及底線和下底線是等效的,因此請使用對您來說最直觀的屬性。

請注意,並非所有屬性都受到所有終端機類型支援,而且有些終端機可能不支援任何這些序列。特別是深色和淡色、斜體、閃爍和隱藏通常未實作。

已識別的正常前景顏色屬性(顏色 0 到 7)為

black  red  green  yellow  blue  magenta  cyan  white

對應的明亮前景顏色屬性(顏色 8 到 15)為

bright_black  bright_red      bright_green  bright_yellow
bright_blue   bright_magenta  bright_cyan   bright_white

已識別的正常背景顏色屬性(顏色 0 到 7)為

on_black  on_red      on_green  on yellow
on_blue   on_magenta  on_cyan   on_white

已識別的明亮背景顏色屬性(顏色 8 到 15)為

on_bright_black  on_bright_red      on_bright_green  on_bright_yellow
on_bright_blue   on_bright_magenta  on_bright_cyan   on_bright_white

對於 256 色終端機,已識別的前景顏色為

ansi0 .. ansi255
grey0 .. grey23

加上 RGB 值為 0 到 5 的 rgbRGB,例如 rgb000rgb515。類似地,已識別的背景顏色為

on_ansi0 .. on_ansi255
on_grey0 .. on_grey23

加上 RGB 值為 0 到 5 的 on_rgbRGB

對於真彩色終端機,已識別的前景顏色為 rRRRgGGGbBBB,其中 RRRGGGBBB 值介於 0 到 255 之間。類似地,已識別的背景顏色為 on_rRRRgGGGbBBB,其中 RRRGGGBBB 值介於 0 到 255 之間。

對於以上列出的任何屬性,大小寫不具意義。

屬性一旦設定,會持續到它們取消設定(透過列印屬性 clearreset)。小心執行此動作,否則您的屬性會在您的腳本執行完畢後持續存在,而且人們會對於他們的提示和輸入被改成奇怪的顏色感到非常惱火。

color(ATTR[, ATTR ...])

color() 將任意數量的字串作為引數,並將它們視為屬性的空白分隔清單。然後它會形成並傳回設定這些屬性的跳脫序列。它不會列印出來,只會傳回,所以如果您想要,您必須自己列印。這是為了讓您可以將它儲存為字串、傳遞給其他東西、傳送到檔案處理常式,或對它執行您可能關心的任何其他操作。如果給定無效的屬性,color() 會擲出例外狀況。

colored(STRING, ATTR[, ATTR ...])
colored(ATTR-REF, STRING[, STRING...])

作為重設顏色的輔助工具,colored() 將一個純量作為第一個引數,將任意數量的屬性字串作為第二個引數,並傳回包含在跳脫碼中的純量,以便在字串之前設定屬性,並在字串之後重設為正常。或者,您可以將對陣列的參考作為第一個引數傳遞,然後將該陣列的內容視為屬性和色彩碼,將其餘的引數視為要著色的文字。

通常,colored() 只會在字串的開頭和結尾放置屬性碼,但是如果您將 $Term::ANSIColor::EACHLINE 設定為某個字串,則該字串將被視為行分隔符,屬性將在傳遞字串的每一行的開頭設定,並在每一行的結尾重設。如果輸出包含換行符,而且您正在使用背景顏色,這通常是理想的,因為跨換行符持續存在的背景顏色通常會被終端機解釋為提供下一行的預設背景顏色。像分頁器這樣的程式也可能會對跨行的屬性感到混淆。通常您會想要將 $Term::ANSIColor::EACHLINE 設定為 "\n" 來使用此功能。

如果您正在將輸出交錯到標準輸出和標準錯誤中,而且您沒有強制標準輸出(透過 autoflush() 或設定 $|),請特別考慮設定 $Term::ANSIColor::EACHLINE。如果您沒有這樣做,重設顏色的碼可能會意外地停留在標準輸出緩衝區中,而不是顯示在螢幕上,導致標準錯誤輸出出現在錯誤的顏色中。

uncolor(ESCAPE)

uncolor() 執行與 color() 相反的轉換,將跳脫序列轉換成對應於這些序列所設定屬性的字串清單。uncolor() 絕不會傳回 ansi16ansi255,而是偏好使用 greyrgb 名稱(對於 on_ansi16on_ansi255 亦同)。

colorstrip(STRING[, STRING ...])

colorstrip() 從提供的字串中移除所有色彩跳脫序列,在陣列內容中個別傳回已修改的字串,或在純量內容中將它們串接在一起。其參數不會被修改。

colorvalid(ATTR[, ATTR ...])

colorvalid() 採用與 color() 相同的屬性字串,如果所有屬性都已知,則傳回 true,否則傳回 false。

coloralias(ALIAS[, ATTR ...])

如果指定了 ATTR,則會將其解釋為命名屬性或現有別名的空格分隔字串清單。在這種情況下,coloralias() 會為 ATTR 給定的屬性集設定 ALIAS 的別名。從那時起,ALIAS 可以傳遞到 color()、colored() 和 colorvalid() 中,並且與 ATTR 中給定的屬性序列具有相同的含義。此功能的一個可能用途是為 256 色 RGB 色彩提供更有意義的名稱。別名名稱中只允許使用 ASCII 字母數字、._-

如果 ATTR 包含別名,則這些別名將在定義時展開,並且其值將用於定義新的別名。這表示如果您根據另一個別名 B 定義別名 A,然後稍後重新定義別名 B,則別名 A 的值不會改變。

如果未指定 ATTR,則 coloralias() 會傳回 ALIAS 的別名標準屬性或屬性(如果有的話),或者如果 ALIAS 不存在,則傳回 undef。如果它被別名到多個屬性,則傳回值將是單一字串,並且屬性將以空格分隔。

這是 ANSI_COLORS_ALIASES 環境變數(請參閱下方的 "ENVIRONMENT")所使用的相同功能,但可以在執行時使用,而不僅僅是在載入模組時使用。

稍後使用相同 ALIAS 呼叫 coloralias() 將會覆寫先前的別名。沒有辦法移除別名。

別名對 uncolor() 的回傳值沒有影響。

警告:別名是全域性的,會影響同一個程序中的所有呼叫者。沒有辦法設定僅限於特定程式碼區塊或特定物件的別名。

常數介面

或者,如果你匯入 :constants,你可以直接使用下列常數

CLEAR           RESET             BOLD            DARK
FAINT           ITALIC            UNDERLINE       UNDERSCORE
BLINK           REVERSE           CONCEALED

BLACK           RED               GREEN           YELLOW
BLUE            MAGENTA           CYAN            WHITE
BRIGHT_BLACK    BRIGHT_RED        BRIGHT_GREEN    BRIGHT_YELLOW
BRIGHT_BLUE     BRIGHT_MAGENTA    BRIGHT_CYAN     BRIGHT_WHITE

ON_BLACK        ON_RED            ON_GREEN        ON_YELLOW
ON_BLUE         ON_MAGENTA        ON_CYAN         ON_WHITE
ON_BRIGHT_BLACK ON_BRIGHT_RED     ON_BRIGHT_GREEN ON_BRIGHT_YELLOW
ON_BRIGHT_BLUE  ON_BRIGHT_MAGENTA ON_BRIGHT_CYAN  ON_BRIGHT_WHITE

這些與 color('屬性') 相同,如果你偏好輸入,可以使用這些

print BOLD BLUE ON_WHITE "Text", RESET, "\n";

print colored ("Text", 'bold blue on_white'), "\n";

(請注意,新行會保持分開,以避免如上所述混淆終端機,因為正在使用背景顏色。)

如果你匯入 :constants256,你可以直接使用下列常數

ANSI0 .. ANSI255
GREY0 .. GREY23

RGBXYZ (for X, Y, and Z values from 0 to 5, like RGB000 or RGB515)

ON_ANSI0 .. ON_ANSI255
ON_GREY0 .. ON_GREY23

ON_RGBXYZ (for X, Y, and Z values from 0 to 5)

請注意,:constants256 不包含其他常數,所以如果你想要混合兩者,你需要同時包含 :constants。你可能想要明確匯入至少 RESET,例如

use Term::ANSIColor 4.00 qw(RESET :constants256);

常數介面不支援真彩色和別名。

使用常數時,如果你不想記住要在每列印行的結尾加上 , RESET,你可以將 $Term::ANSIColor::AUTORESET 設為 true 值。然後,如果常數後沒有逗號,顯示模式會自動重設。換句話說,設定該變數後

print BOLD BLUE "Text\n";

會在之後重設顯示模式,而

print BOLD, BLUE, "Text\n";

則不會。如果你正在使用背景顏色,你可能想要使用 say()(在較新版本的 Perl 中)或使用個別列印陳述式列印新行,以避免混淆終端機。

如果設定了 $Term::ANSIColor::AUTOLOCAL(見下方),它會優先於 $Term::ANSIColor::AUTORESET,而後者會被忽略。

子常式介面優於常數介面,因為只會匯出兩個子常式到你的命名空間,而常數介面會匯出三十八個,並且支援別名和真彩色屬性。另一方面,常數介面有更好的編譯時錯誤檢查的優點,因為在呼叫 color() 和 colored() 時,拼錯顏色或屬性的名稱在執行時才會被偵測到,而拼錯常數的名稱會在編譯時被偵測到。所以,用將近二十個你可能甚至不常使用的子常式來污染你的命名空間,或者冒著因輸入錯誤而產生愚蠢錯誤的風險。畢竟,TMTOWTDI,由你選擇。

色彩堆疊

你可以匯入 :pushpop 並使用 PUSHCOLOR、POPCOLOR 和 LOCALCOLOR 來維護一個色彩堆疊。PUSHCOLOR 會取得其引數開頭的屬性字串,並將其推入屬性堆疊中。POPCOLOR 會移除堆疊頂端,並復原先前 PUSHCOLOR 引數所設定的前一個屬性。LOCALCOLOR 會用 PUSHCOLOR 和 POPCOLOR 包圍其引數,以便在之後重設色彩。

如果設定了 $Term::ANSIColor::AUTOLOCAL,每個色彩常數序列在內部都會加上 LOCALCOLOR。換句話說,下列

{
    local $Term::ANSIColor::AUTOLOCAL = 1;
    print BLUE "Text\n";
}

等於

print LOCALCOLOR BLUE "Text\n";

如果設定了 $Term::ANSIColor::AUTOLOCAL,它將優先於 $Term::ANSIColor::AUTORESET,而後者將被忽略。

使用 PUSHCOLOR、POPCOLOR 和 LOCALCOLOR 時,特別重要的是不要在常數之間放置逗號。

print PUSHCOLOR BLUE "Text\n";

將正確地將 BLUE 推送到堆疊的頂部。

print PUSHCOLOR, BLUE, "Text\n";    # wrong!

不會,後續的 pop 也無法還原正確的屬性。PUSHCOLOR 會推送其引數設定的屬性,通常是顏色常數的字串。它無法詢問終端機目前的屬性為何。

支援 CLICOLOR

https://bixense.com/clicolors/ 建議使用兩個環境變數 CLICOLOR 和 CLICOLOR_FORCE 來啟用和停用主控台命令的彩色輸出。Term::ANSIColor 無法自動支援此標準,因為正確的動作取決於輸出的去向,而 Term::ANSIColor 可能用於即使在環境中設定了 CLICOLOR 也應始終產生顏色的情況中。但您可以使用支援的環境變數 ANSI_COLORS_DISABLED 在自己的程式中實作 CLICOLOR,使用類似這樣的程式碼

if (exists($ENV{CLICOLOR}) && $ENV{CLICOLOR} == 0) {
    if (!$ENV{CLICOLOR_FORCE}) {
        $ENV{ANSI_COLORS_DISABLED} = 1;
    }
}

如果您使用常數介面,請務必在使用任何顏色常數(例如在腳本的最上方)之前包含此程式碼,因為此環境變數僅在第一次看到顏色常數時才會被採用。

請注意,這也會將 ANSI_COLORS_DISABLED 匯出到程式的任何子處理程序。

診斷

錯誤的顏色對應 %s

(W) 從 ANSI_COLORS_ALIASES 指定的顏色對應無效,無法解析。它已被忽略。

錯誤的跳脫序列 %s

(F) 您傳遞了一個無效的 ANSI 跳脫序列給 uncolor()。

在使用「嚴格子常式」時不允許裸字元 "%s"

(F) 您可能輸入錯誤的常數顏色名稱,例如

$Foobar = FOOBAR . "This line should be blue\n";

@Foobar = FOOBAR, "This line should be blue\n";

這只會顯示在使用嚴格子常式的情況下(在嚴格子常式下執行的另一個好理由)。

無法設定標準顏色 %s 的別名

(F) 傳遞給 coloralias() 的別名名稱與標準顏色名稱相符。無法設定標準顏色名稱的別名。

無法在 %s 中別名標準顏色 %s

(W) 相同,但位於 ANSI_COLORS_ALIASES 中。已忽略顏色對應。

無效的別名名稱 %s

(F) 您傳遞無效的別名名稱給 coloralias()。別名名稱只能包含字母數字、.-_

在 %s 中無效的別名名稱 %s

(W) 您在 ANSI_COLORS_ALIASES 中顏色對應的等號左邊指定無效的別名名稱。已忽略顏色對應。

無效的屬性名稱 %s

(F) 您傳遞無效的屬性名稱給 color()、colored() 或 coloralias()。

在 %s 中無效的屬性名稱 %s

(W) 您在 ANSI_COLORS_ALIASES 中顏色對應的等號右邊指定無效的屬性名稱。已忽略顏色對應。

名稱 "%s" 僅使用一次:可能的錯字

(W) 您可能誤植常數顏色名稱,例如

print FOOBAR "This text is color FOOBAR\n";

最好在常數名稱後始終使用逗號,以強制下一個錯誤。

檔案處理後不允許使用逗號

(F) 您可能輸入錯誤的常數顏色名稱,例如

print FOOBAR, "This text is color FOOBAR\n";

產生此致命編譯錯誤是使用常數介面的主要優點之一,因為如果您誤植顏色名稱,您將立即知道。

沒有針對跳脫序列 %s 的名稱

(F) 傳遞給 uncolor() 的 ANSI 跳脫序列包含無法辨識且無法轉換為名稱的跳脫。

環境

ANSI_COLORS_ALIASES

此環境變數允許使用者指定自訂顏色別名,color()、colored() 和 colorvalid() 會了解這些別名。其他函式都不會受到影響,且不會建立新的顏色常數。自訂顏色是現有顏色名稱的別名;無法引入新的跳脫序列。別名名稱中只允許使用字母數字、._-

格式為

ANSI_COLORS_ALIASES='newcolor1=oldcolor1,newcolor2=oldcolor2'

忽略空白字元。別名值可以是單一屬性或以空白分隔的屬性清單。

例如,Solarized 顏色可以對應到

ANSI_COLORS_ALIASES='\
    base00=bright_yellow, on_base00=on_bright_yellow,\
    base01=bright_green,  on_base01=on_bright_green, \
    base02=black,         on_base02=on_black,        \
    base03=bright_black,  on_base03=on_bright_black, \
    base0=bright_blue,    on_base0=on_bright_blue,   \
    base1=bright_cyan,    on_base1=on_bright_cyan,   \
    base2=white,          on_base2=on_white,         \
    base3=bright_white,   on_base3=on_bright_white,  \
    orange=bright_red,    on_orange=on_bright_red,   \
    violet=bright_magenta,on_violet=on_bright_magenta'

讀取此環境變數並套用時,Term::ANSIColor 模組已載入,然後會被忽略。在載入模組後變更 ANSI_COLORS_ALIASES 不會產生任何效果。請參閱 coloralias(),以取得可以在執行階段使用的等效功能。

ANSI_COLORS_DISABLED

如果此環境變數設為 true 值,此模組定義的所有函式(color()、colored() 和所有常數)都不會輸出任何跳脫序列,而只會傳回空字串或適當地傳遞原始文字。此功能旨在支援在不支援 ANSI 跳脫序列的平台上,使用此模組的腳本輕鬆使用。

NO_COLOR

如果此環境變數設為任何值,它會抑制跳脫序列的產生,就像將 ANSI_COLORS_DISABLED 設為 true 值一樣。此功能實作了 https://no-color.org/ 非正式標準。即使設定了 NO_COLOR,仍想啟用顏色的程式需要在使用此模組提供的任何常數或函式之前,取消設定該環境變數。

相容性

Term::ANSIColor 最早於 Perl 5.6.0 中包含在 Perl 中。

uncolor() 函式和對 ANSI_COLORS_DISABLED 的支援已新增至 Term::ANSIColor 1.04,並包含在 Perl 5.8.0 中。

對 dark 的支援已新增至 Term::ANSIColor 1.08,並包含在 Perl 5.8.4 中。

色彩堆疊,包括 :pushpop 匯入標籤、PUSHCOLOR、POPCOLOR、LOCALCOLOR 和 $Term::ANSIColor::AUTOLOCAL 變數,已新增至 Term::ANSIColor 2.00,並包含在 Perl 5.10.1 中。

colorstrip() 已新增至 Term::ANSIColor 2.01,而 colorvalid() 已新增至 Term::ANSIColor 2.02,兩者都包含在 Perl 5.11.0 中。

對色彩 8 至 15(bright_ 變體)的支援已新增至 Term::ANSIColor 3.00,並包含在 Perl 5.13.3 中。

對斜體的支援已新增至 Term::ANSIColor 3.02,並包含在 Perl 5.17.1 中。

對色彩 16 至 256(ansirgbgrey 顏色)、:constants256 匯入標籤、coloralias() 函式和對 ANSI_COLORS_ALIASES 環境變數的支援已新增至 Term::ANSIColor 4.00,並包含在 Perl 5.17.8 中。

$Term::ANSIColor::AUTOLOCAL 已變更為優先於 $Term::ANSIColor::AUTORESET,而不是相反,已包含在 Term::ANSIColor 4.00 中,並包含在 Perl 5.17.8 中。

ansi16ansi255,作為 rgbgrey 顏色的別名,以及對應的 on_ansi 名稱和 ANSION_ANSI 常數已新增至 Term::ANSIColor 4.06,並包含在 Perl 5.25.7 中。

對真彩色的支援(rNNNgNNNbNNNon_rNNNgNNNbNNN 屬性)、定義別名以其他別名為準,以及對應到多個屬性(而非僅單一屬性)的別名已新增至 Term::ANSIColor 5.00 中。

Term::ANSIColor 5.01 中新增了對 NO_COLOR 的支援。

限制

colored() 和許多使用色彩常數的情況會在換行後加入重設跳脫序列。如果程式將彩色輸出混入標準輸出和標準錯誤輸出,這可能會導致標準錯誤文字顯示錯誤色彩,因為重設跳脫序列尚未傳送至顯示器(因為預設會對終端的標準輸出進行行緩衝)。為避免此情況,請對 STDOUT 設定 autoflush(),或將 $Term::ANSIColor::EACHLINE 設定為 "\n"

如果可以完全省略常數周圍的逗號,然後只說

print BOLD BLUE ON_WHITE "Text\n" RESET;

會很好,但 Perl 的語法不允許這樣做。字串後需要一個逗號。(當然,你可以認為不需要在所有常數之間加上逗號是一個錯誤,因此你可以在不使用 $Term::ANSIColor::AUTORESET 或 PUSHCOLOR/POPCOLOR 時自由插入逗號。)

為了更容易除錯,你可能偏好於在不設定 $Term::ANSIColor::AUTORESET 或 PUSHCOLOR/POPCOLOR 時始終使用逗號,這樣你會收到致命編譯錯誤,而不是警告。

無法使用這個模組來使用 Perl 格式嵌入格式化和色彩屬性。它們會用空格取代跳脫字元(如 perlform(1) 中所述),導致無法辨識的屬性產生亂碼輸出。即使有方法可以解決這個問題,格式也不知道非列印跳脫序列的長度為零,而且會錯誤地格式化輸出。對於使用色彩或其他屬性的格式化輸出,請改用 sprintf(),或使用 formline(),然後在格式化後和輸出前加入色彩或其他屬性。

注意事項

這個模組產生的程式碼是標準終端控制碼,符合 ECMA-048 和 ISO 6429(一般稱為色彩碼的「ANSI 色彩」)。非色彩控制碼(粗體、深色、斜體、底線和反白)是較早的 ANSI X3.64 標準的一部分,用於視訊終端和周邊設備的控制序列。

請注意,並非所有顯示器都符合 ISO 6429,甚至 X3.64(或甚至嘗試符合)。這個模組在不支援這些跳脫序列的顯示器上無法按預期運作,例如 Windows NT 或 Windows 2000 下的 cmd.exe、4nt.exe 和 command.com。它們可能會被忽略,或顯示為 ESC 字元後接一些明顯的垃圾。

Jean Delvare 提供了以下不同常見終端模擬器的表格及其對各種屬性的支援,其他人也協助我充實了它

             clear    bold     faint   under    blink   reverse  conceal
------------------------------------------------------------------------
xterm         yes      yes      no      yes      yes      yes      yes
linux         yes      yes      yes    bold      yes      yes      no
rxvt          yes      yes      no      yes  bold/black   yes      no
dtterm        yes      yes      yes     yes    reverse    yes      yes
teraterm      yes    reverse    no      yes    rev/red    yes      no
aixterm      kinda   normal     no      yes      no       yes      yes
PuTTY         yes     color     no      yes      no       yes      no
Windows       yes      no       no      no       no       yes      no
Cygwin SSH    yes      yes      no     color    color    color     yes
Terminal.app  yes      yes      no      yes      yes      yes      yes

Windows 是 Windows telnet,Cygwin SSH 是 Windows NT 上 Cygwin 下的 OpenSSH 實作,而 Mac Terminal 是 Mac OS X 中的 Terminal 應用程式。如果輸入不是「是」或「否」,該模擬器會將給定的屬性顯示為其他東西。請注意,在 aixterm 上,清除不會重設色彩;您必須明確地將色彩設定回您想要的色彩。歡迎在這個表格中加入更多輸入。

很少支援代碼 3(斜體),因此在該表格中未提及。雖然在 Linux 主控台中顯示為綠色,但它並未被列出的任何終端機完全支援,但據報導 urxvt 支援它。

請注意,代碼 6(快速閃爍)和 9(刪除線)已在 ANSI X3.64 和 ECMA-048 中指定,但大多數顯示器和模擬器並不普遍支援,因此此模組也不支援。ECMA-048 還指定了許多其他屬性,包括字型變更、分數字元、雙底線、框線、圓圈和上線的屬性序列。由於這些屬性都沒有得到廣泛支援或有用,因此此模組目前也不支援它們。

大多數現代 X 終端機模擬器支援 256 色。已知不支援這些色彩的有 aterm、rxvt、Terminal.app 和 TTY/VC。

有關各種終端機模擬器中真彩色支援的資訊,請參閱 真彩色支援

作者

Zenin 的原始構想(使用常數),Russ Allbery <rra@cpan.org> 使用子程式重新實作,然後由 Russ 結合 Zenin 的原始構想並加入輸入。256 色支援基於 Kurt Starsinic 的工作。Russ Allbery 現在維護此模組。

PUSHCOLOR、POPCOLOR 和 LOCALCOLOR 是由 openmethods.com 語音解決方案提供的。

著作權和授權

著作權 1996-1998、2000-2002、2005-2006、2008-2018、2020 Russ Allbery <rra@cpan.org>

著作權 1996 Zenin

著作權 2012 Kurt Starsinic <kstarsinic@gmail.com>

此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

另請參閱

CPAN 模組 Term::ExtendedColor 為 256 色模擬器提供了一個不同且更全面的介面,可能更方便。CPAN 模組 Win32::Console::ANSI 在 Win32 主控台環境中提供 ANSI 色彩(和其他跳脫序列)支援。CPAN 模組 Term::Chrome 使用物件和運算子重載提供不同的介面。

ECMA-048 可在線上取得(至少在撰寫本文時),網址為 https://www.ecma-international.org/publications/standards/Ecma-048.htm

ISO 6429 可自 ISO 取得,但需付費;此模組的作者並未擁有其副本。由於 ISO 6429 的原始資料為 ECMA-048,且後者可免費取得,因此取得 ISO 標準的理由似乎不多。

256 色控制序列記載於 https://invisible-island.net/xterm/ctlseqs/ctlseqs.html(搜尋 256 色)。

各種終端機模擬器中真彩支援的資訊,以及可執行以檢查終端機模擬器中真彩支援的測試程式,可於 https://gist.github.com/XVilka/8346728 取得。

CLICOLORSNO_COLOR 是有用的標準,對於任何使用色彩的應用程式而言,理想上應了解並遵循。Term::ANSIColor 符合後者。

此模組的最新版本可隨時自其網站 https://www.eyrie.org/~eagle/software/ansicolor/ 取得。自 5.6.0 起,它也是 Perl 核心套件的一部分。