однострочный ввод
Вот более короткая однострочная версия:
% 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 часто оказывается в 2-3 раза короче, чем Python, чтобы выполнять ту же работу.И вам не нужно идти на компромисс с ясностью;что может быть проще, чем одна строка выше?
Запрограммированный вывод
Я знаю, я знаю.Если вы еще не знаете язык, это может быть понятнее:
#!/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);
TMTOWTDI
Perl поддерживает более одного способа сделать что-то, чтобы вымогу выбрать тот, который вам удобнее всего.Если бы это было что-то, что я планировал зарегистрировать как школьный или рабочий проект, я бы определенно выбрал более длинные, более осторожные версии - или, по крайней мере, добавил бы комментарий в сценарий оболочки, если бы использовал однострочники.
Вы можете найти документацию по Perl в своей системе.Просто введите
% man perl
% man perlrun
% man perlvar
% man perlfunc
и т. Д. В командной строке.Если вы хотите использовать в Интернете симпатичные версии, получите справочные страницы для perl , perlrun , perlvar и perlfunc из http://perldoc.perl.org.