使用终端颜色来区分信息

该模块 Term::ANSIColor 是我最喜欢的Perl工具之一。它并不能让我的程序运行得更好,但它允许我快速识别对我重要的输出,而不会错过其他内容。我最近用它来追踪我的最新书籍的发货情况。
当 Learning Perl 6 出版并且有纸质版可用时,我欠大约100人一本签名书。从我出版印刷版Perl杂志的这些年里,我知道实物发货是一项痛苦和记忆的锻炼。我是否发出了这本书?我是什么时候发出的?我从未完全确信任务已经完成,因为包裹可能会丢失,而收件人却没有意识到他们丢失了东西。几个月后我收到投诉。没什么大不了的——这就是零售业的生活。
我通过美国邮政服务发送这些包裹,并为每个包裹获得一个追踪号。我可以在USPS网站上手动检查这些信息,但我还编写了Business::US::USPS::WebTools模块来自动处理这些信息。我可以使用邮局的Web API(尽管它很基础)来获取包裹的状态。
有趣的是,这个夏天我刚刚放弃了这个模块,因为我不再想维护它。我已有一两年没有使用它,而且Web API接口也略有变化。几周后我又找到了它的另一个用途。真是令人费解。现在它位于我设置的CPAN Adoptable Modules GitHub组织。如果你有不再想要的模块仓库,让我知道。我会把它们拉入这个组织,你可以从自己的账户中删除它们。任何以后想维护它们的人仍然可以找到它们。还有GitPAN,但这并不是一回事。
要使用此程序,从GitHub获取模块源代码。我不得不更新一些东西以使其工作,我可能还会进行进一步的更改。2018年10月2日的提交27c9443应该很好。(是的,不指向CPAN上的版本感觉很奇怪)。
你还需要从WebTools网站获取凭证。它们听起来像政府官员会审查你的应用程序,但几分钟后你会收到一封电子邮件。美国邮政服务从未有人联系过我询问我在做什么。美国政府的一个好奇心是邮局有自己的警察力量(主要是针对邮件盗窃或邮件欺诈)。但我不必担心这一点,因为我的程序遵循服务的预期用途。
我将从一个简短的程序开始,该程序获取单个追踪号的记录。我把我的凭证放在环境中,这样我就可以轻松地获取它们用于我创建的任何其他WebTools程序。这个程序打印出装运的摘要(尽管从我放下包裹到它们交付的整个过程中有很多步骤)
use v5.28;
use utf8;
use strict;
use warnings;
use lib qw(/path/to/business-us-usps-webtools/lib);
use Business::US::USPS::WebTools::TrackConfirm;
my $tracker = Business::US::USPS::WebTools::TrackConfirm->new( {
UserID => $ENV{USPS_WEBTOOLS_USERID},
Password => $ENV{USPS_WEBTOOLS_PASSWORD},
} );
my $tracking_number = $ARGV[0];
my $details = $tracker->track( TrackID => $tracking_number );
if( $tracker->is_error ) {
warn "Oh No! $tracker->{error}{description}\n";
}
else {
no warnings 'uninitialized';
state @keys = qw(EventTime EventDate Event EventCity);
printf "%-22s %8s %-20s %s %s\n",
$tracking_number, $details->[0]->@{@keys};
}
输出是有用的,但很无聊(而且我已经突变了追踪号,它们不再有效,也不代表实际的装运)
$ perl track-one.pl 84058036993006920289
84058036993006920289 8:38 am September 14, 2018 Delivered, In/At Mailbox NEW YORK
$ perl track-one.pl CJ6467937US
CJ6467937US 9:38 am September 26, 2018 Departed PARIS
使用这个程序比我亲自去USPS网站粘贴号码到他们的表格要快得多。它可以更好——我真正想知道的是我是否需要对某个装运做些什么。我可以阅读输出以了解这一点。如果是“已投递”,那么我应该没事。如果不是,它仍然可能会丢失。但是阅读是困难的!添加颜色可以减轻我扫描整行文本的负担。程序可以为我读取文本并用颜色分类。
Term::ANSIColor 通过输出特殊的转义序列来工作,这些序列指示 (ANSI) 终端切换颜色。新的颜色将在你输出特殊重置序列(或切换到另一种颜色)之前生效。
$ perl -MTerm::ANSIColor=:constants -e 'print RED, "Hello World", RESET'
Hello World
我可以在我的跟踪程序中做到这一点。我将使用绿色表示未完成的货物(在深色背景上的亮色),以及蓝色(较暗的颜色,可以减弱线条)来表示已交付的货物。我可以通过颜色知道状态。
use v5.28;
use utf8;
use strict;
use warnings;
use lib qw(/path/to/business-us-usps-webtools/lib);
use Business::US::USPS::WebTools::TrackConfirm;
use Term::ANSIColor;
my $tracker = Business::US::USPS::WebTools::TrackConfirm->new( {
UserID => $ENV{USPS_WEBTOOLS_USERID},
Password => $ENV{USPS_WEBTOOLS_PASSWORD},
} );
my $tracking_number = $ARGV[0];
my $details = $tracker->track( TrackID => $tracking_number );
if( $tracker->is_error ) {
warn "Oh No! $tracker->{error}{description}\n";
}
else {
no warnings 'uninitialized';
state @keys = qw(EventTime EventDate Event EventCity );
print color(
$details->[0]{Event} =~ m/Delivered/ ? 'blue' : 'green'
);
printf "%-22s %8s %-20s %s %s\n", $tracking_number, $details->[0]->@{@keys};
print color('reset');
}
这很好,但我不想一个个做。我所有的跟踪号都在一个文件里(实际上是电子表格,但这在这里并不重要)。我想一次性检查它们。我可以在一个 while
循环中做到这一点,该循环从标准输入获取行。当然,数据有点脏,所以我移除了空格(USPS在不同的页面上以不同的方式格式化它)并跳过了空行。我确实有一些检查跟踪号有效性的代码,但它有点过时,没有涵盖他们最近给我的某些新(未记录)的号码。所以我就只能进行这些简单的检查。否则,程序大致相同。
use v5.28;
use utf8;
use strict;
use warnings;
use lib qw(/path/to/business-us-usps-webtools/lib);
use Business::US::USPS::WebTools::TrackConfirm;
use Term::ANSIColor;
my $tracker = Business::US::USPS::WebTools::TrackConfirm->new( {
UserID => $ENV{USPS_WEBTOOLS_USERID},
Password => $ENV{USPS_WEBTOOLS_PASSWORD},
} );
while( <> ) {
chomp;
s/\s+//g;
next unless length $_;
my $details = $tracker->track( TrackID => $_ );
if( $tracker->is_error ) {
warn "Oh No! $tracker->{error}{description}\n";
}
else {
no warnings 'uninitialized';
state @keys = qw(EventTime EventDate Event EventCity );
print color(
$details->[0]{Event} =~ m/Delivered/ ? 'blue' : 'green'
);
printf "%-22s %8s %-20s %s %s\n", $_, $details->[0]->@{@keys};
print color('reset');
}
}
现在,未完成的货物与已交付的货物区分开来。即使在高度模糊的截图上,我也能看出哪些行是我想要调查的。我已经模糊了这张图片以保护个人信息,但即使这样,我也能挑出那些仍未到达的货物。
这真令人惊叹。许多国家的国际合作相当不错。我可以追踪到许多国家的最终交付。
标签
布莱恩·D·弗伊
布莱恩·D·弗伊 是一名 Perl 训练师和作家,同时也是 Perl.com 的资深编辑。他是《精通 Perl》、《Mojolicious Web 客户端》、《学习 Perl 练习》的作者,以及《Perl 编程》、《学习 Perl》、《中级 Perl》和《有效 Perl 编程》的合著者。
查看他们的文章
反馈
这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。
- More commenting... maybe?
github.polettix.it - Perl Weekly Challenge 121: Invert Bit
blogs.perl.org - Web nostalgia: MojoX::Mechanize
github.polettix.it - On the eve of CPAN Testers
blogs.perl.org - PWC121 - The Travelling Salesman
github.polettix.it - PWC121 - Invert Bit
github.polettix.it - Floyd-Warshall algorithm implementations
github.polettix.it - Perl Weekly Challenge 120: Swap Odd/Even Bits and Clock Angle
blogs.perl.org - How I Uploaded a CPAN Module
blogs.perl.org - App::Easer released on CPAN
github.polettix.it