这是较短的单线版本:
% perl -ln0e 'print tell' < inputfile
这是一个稍长的单线:
% perl -e '($/,$\) = ("\0","\n"); print tell while <STDIN>' < inputfile
% perl -MO=Deparse,-p -ln0e 'print tell'
BEGIN { $/ = "\000"; $\ = "\n"; }
LINE: while (defined(($_ = <ARGV>))) {
chomp($_);
print(tell);
}
如果您想将其放在文件中,而不是从命令行调用它,那么这里是一个更明确的版本:
#!/usr/bin/env perl
use English qw[ -no_match_vars ];
$RS = "\0"; # input separator for readline, chomp
$ORS = "\n"; # output separator for print
while (<STDIN>) {
print tell();
}
这是很长的版本:
#!/usr/bin/env perl
use strict;
use autodie; # for perl5.10 or better
use warnings qw[ FATAL all ];
use IO::Handle;
IO::Handle->input_record_separator("\0");
IO::Handle->output_record_separator("\n");
binmode(STDIN); # just in case
while (my $null_terminated = readline(STDIN)) {
# this just *past* the null we just read:
my $seek_offset = tell(STDIN);
print STDOUT $seek_offset;
}
close(STDIN);
close(STDOUT);
顺便说一句,要创建测试输入文件,我没有使用过长的Python大型脚本;我只是使用了这个简单的Perl单行代码:
% perl -e 'print 0.0.0.0.2.4.6.8.0.1.3.0.5.20' > inputfile
您会发现,完成相同的工作,Perl通常比Python短2-3倍。而且您不必在清晰度上妥协;有什么比上面的一线简单?
我知道我知道。如果您还不懂该语言,这可能会更清楚:
#!/usr/bin/env perl
@values = (
0, 0, 0, 0, 2,
4, 6, 8, 0, 1,
3, 0, 5, 20,
);
print pack("C*", @values);
尽管这也可行:
print chr for @values;
一样
print map { chr } @values;
尽管对于那些喜欢所有严谨,细心和全部的人来说,这可能是您所看到的更多:
#!/usr/bin/env perl
use strict;
use warnings qw[ FATAL all ];
use autodie;
binmode(STDOUT);
my @octet_list = (
0, 0, 0, 0, 2,
4, 6, 8, 0, 1,
3, 0, 5, 20,
);
my $binary = pack("C*", @octet_list);
print STDOUT $binary;
close(STDOUT);
Perl支持多种处理方式,因此您可以选择最习惯的一种方式。如果这是我计划作为学校或工作项目检查的内容,那么我肯定会选择更长,更仔细的版本- 如果我使用的是单行代码,或者至少在shell脚本中添加注释。
您可以在自己的系统上找到Perl的文档。只需输入
% man perl
% man perlrun
% man perlvar
% man perlfunc
等在您的shell提示下。如果要在网上使用漂亮的版本,请从http://perldoc.perl.org获取perl,perlrun,perlvar和perlfunc的联机帮助页。