LINUX.ORG.RU

Громко ругаем реализацию List to CSV line

 ,


0

2
#!/usr/bin/perl
sub csvLine {
 my ($csvSep,$csvQuo)=map {substr($_,0,1)} (shift,shift);
 return join($csvSep,map {
                           length($_)==0 || /^[0-9]+(?:\.[0-9]+)?$/
                           ?
                            $_
                           :
                            do {
                             (my $t=$_)=~s/$csvQuo/${csvQuo}${csvQuo}/og;
                             $csvQuo.$t.$csvQuo
                            }
                         } @_
                  );
}
print csvLine(',','"',('', 'a " b',12,14.75,'c')),"\n";

Недостатки с моей т.з.:

- Использование «лишней» переменной $t ($t нужна из-за того, что $_ нельзя менять)

- Использование do {}

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

Лень разбираться, но:
Не бойся ставить пробелы - после запятых, вокруг знаков присвяивания, etc.

anonymous
()

Ужасный perl_style, много синтаксического мусора.

outtaspace ★★★
()

В нулевом приближении как-то так. Сразу вижу 2 омерзительные привычки:

-- объявление функций в начале кода (у тебя ведь нет замыканий? разницу между func expression и func declaration знаем?).

-- запятая перед «\n»

sub csvLine {
    my ($csvSep, $csvQuo) = map { substr $_, 0, 1 } shift, shift;

    join $csvSep, map {
        length || /^[0-9]+(?:\.[0-9]+)?$/ ? $_ : do {
            (my $t = $_) =~ s/$csvQuo/${csvQuo}${csvQuo}/og;
            $csvQuo . $t . $csvQuo;
        }
    } @_;
}
outtaspace ★★★
()
my ($csvSep,$csvQuo)=map {substr($_,0,1)} (shift,shift);

Нет проверки на undef. А зачем обрезать аргументы до одного символа? гибкость теряется же и может выстрелить непредсказуемо, если передать неверный сепаратор. Я бы или сделал die или warn unless length $_==1

disarmer ★★★
()
Ответ на: комментарий от disarmer

Нет проверки на undef

Если включены варнинги, то этого вполне достаточно для примитивного защитного программирования.

outtaspace ★★★
()

$t не нужен, т.к.есть do {}

local $_;
s/$csvQuo/${csvQuo}${csvQuo}/og;
$csvQuo.$t.$csvQuo;

joy4eg ★★★★★
()
Ответ на: комментарий от outtaspace

объявление функций в начале кода

Там весь код состоит из одной этой функции, где же её ещё помещать? :)

запятая перед «\n»

Возможно. Сам её недавно стал использовать, раньше конкатенацию делал.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Там весь код состоит из одной этой функции, где же её ещё помещать? :)

Вы же на форуме, а не на код-ревью. Помещайте где хотите.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Так вы же сказали, что надо декларацию сначала, а потом функцию. А какой в этом смысл, если не код-ревью и в принципе весь кусок кода из одной функции и её вызова состоит? :)

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не понял, почему вдруг она не reusable

DRVTiny ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.