Каковы некоторые элегантные функции или использование Perl? - PullRequest
35 голосов
/ 13 марта 2009

Что? Красивый Perl? Элегантный ? Должно быть, он шутит!

Это правда, там какой-то уродливый Perl. И под некоторыми я имею в виду много. Мы все это видели.

Ну да, это символ супа. Не так ли?

Да, есть символы. Также как у «математики» есть «символы». Просто мы, программисты, лучше знакомы со стандартными математическими символами. Мы выросли, чтобы принимать символы из наших родных языков, будь то ASM, C или Pascal. Perl просто решил иметь еще несколько.

Ну, я думаю, мы должны избавиться от всех ненужных символов. Делает код лучше.

Язык для этого уже существует. Это называется Lisp. (и скоро, perl 6 .)

Хорошо, умный парень. Правда, я уже могу изобретать свои собственные символы. Они называются функциями и методами. Кроме того, мы не хотим изобретать APL .

О, фальшивое альтер эго, ты такой смешной! Это правда, Perl может быть довольно красивым. Это может быть довольно некрасиво. С Perl, TIMTOWTDI .

Итак, какие ваши любимые элегантные фрагменты кода Perl?

Ответы [ 14 ]

2 голосов
/ 13 марта 2009

Добавив к любви map и grep, мы можем написать простой парсер командной строки.

my %opts = map { $_ => 1 } grep { /^-/ } @ARGV;

Если мы хотим, мы можем установить для каждого флага его индекс в @ARGV:

my %opts = map { $ARGV[$_] => $_ } grep { $ARGV[$_] =~ /^-/ } 0 .. $#ARGV;

Таким образом, если у флага есть аргумент, мы можем получить аргумент так:

if( defined( $opts{-e} ) ) {
  my $arg = $ARGV[ $opts{-e} ];
  # do -e stuff for $arg
}

Конечно, некоторые люди будут плакать, что мы заново изобретаем колесо, и нам следует использовать getopt или какой-то другой его вариант, но, честно говоря, это было довольно легко изобрести заново. Кроме того, я не люблю getopt.

Если вам не нравится, как долго некоторые из этих строк, вы всегда можете использовать промежуточные переменные или просто удобные разрывы строк (эй, фанатики Python? Вы слышали это? Мы можем поместить одну строку кода в две строки, и это все еще работает!), чтобы он выглядел лучше:

my %opts = map  { $ARGV[$_] => $_   }
           grep { $ARGV[$_] =~ /^-/ } 0 .. $#ARGV;
1 голос
/ 02 июня 2014

Моя любимая элегантная функция Perl состоит в том, что она использует различные операторы для числовых значений и строковых значений.

my $string = 1 . 2;
my $number = "1" + "2";
my $unambiguous = 1 . "2";

Сравните это с другими динамическими языками, такими как JavaScript, где "+" используется для объединения и сложения.

var string = "1" + "2";
var number = 1 + 2;
var ambiguous = 1 + "2";

Или для динамических языков, таких как Python и Ruby, которые требуют приведения типов между строками и числовыми значениями.

string = "1" + "2"
number = 1 + 2
throws_exception = 1 + "2"

По моему мнению, Perl понимает это правильно, а другие языки понимают это неправильно.

1 голос
/ 23 июля 2009

Этот механизм синтаксического анализа файлов компактен и прост в настройке (пропуск пустых строк, пропуск строк, начинающихся с X и т. Д.).

open(H_CONFIG, "< $file_name") or die("Error opening file: $file_name! ($!)");
while (<H_CONFIG>)
{
   chomp;         # remove the trailing newline
   next if $_ =~ /^\s*$/; # skip lines that are blank
   next if $_ =~ /^\s*#/; # skip lines starting with comments
   # do something with the line
}

Я использую этот тип конструкции в различных ситуациях сборки - где мне нужно либо предварительно, либо после обработки обработать файлы полезной нагрузки (S-записи и т. Д.) Или C-файлы или собрать информацию каталога для «умной сборки». 1004 *

0 голосов
/ 13 марта 2009

Более бедные машинистки, такие как я, у которых судороги слишком часто нажимают клавишу Shift и почти безрассудно боятся использовать точку с запятой, начали писать наш код Perl в форматированных файлах python. :)

, например

>>> k = 5
>>> reduce(lambda i,j: i*j, range(1,k+1),1)
120
>>> k = 0
>>> reduce(lambda i,j: i*j, range(1,k+1),1)
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...