2013-08-21 7 views
-1

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

open MYFILE, "<", "$ARGV[0]" or die "Can't open $ARGV[0] file \n"; 

############ to retieve the info and put them in associative arrray ############## 

$line = <MYFILE>; 
@line1 = split(/,/ , $line); 
$length = @line1; 
$count = 0; 
while($count < $length) 
{ 
    $line1[$count] =~ s/^\"//; 
    $line1[$count] =~ s/\"$//; 
    $count++; 
} 


$line = <MYFILE>; 
@line2 = split(/,/ , $line); 
$length = @line2; 
$count = 0; 
while($count < $length) 
{ 
    $line2[$count] =~ s/^\"//; 
    $line2[$count] =~ s/\"$//; 
    $count++; 
} 

$count = 0; 
while($count < $length) 
{ 
    $array{$line1[$count]}=$line2[$count]; 
    $count++; 
} 
+1

Я уверен, что вышеупомянутое может быть переписано в bash. Вы что-то пробовали? Если да, то что пошло не так? – marderh

+1

Мне интересно, почему вы хотите конвертировать из Perl в оболочку. –

ответ

2

Конечно, вы можете перевести это в сценарий оболочки: Просто обернуть сценарий PERL в здесь-документ, передать его perl, и поставить #!/bin/sh на вершине ...

#!/bin/sh 
perl - <<'END' $1 
... 
END 

Но более серьезно, вы могли бы достичь просветления путем переписывания кода в другой форме. То, что вы делаете, это читает строку, разделив ее на commata и удаление кавычки в начале и в конце каждого поля:

sub get_fields { 
    map { s/^"//; s/"$//; $_ } split /,/, $_[0]; 
} 

my @keys = get_fields scalar <>; # 1st line 
my @vals = get_fields scalar <>; # 2nd line 

my %hash; 
@hash{ @line1 } = @line2; 

для операции среза в конце исключения, теперь вы можете легко переписать потому что он использует поток данных вместо структурированного программирования в качестве преобладающей парадигмы. Не говоря уже о том, что мой код короче на порядок (в базе 3).

Если вы пишете код для производственных целей, не делайте этого. Он сломается. Я предполагаю, что вы обрабатываете CSV. Stick с Perl и use Text::CSV. Тогда:

use strict; use warnings; use autodie; 
use Text::CSV; 
my $csv = Text::CSV->new({ binary => 1 }); 

open my $fh, "<:utf8", $ARGV[0]; 

my $keys = $csv->getline($fh); 
my $vals = $csv->getline($fh); 

my %hash; 
@hash{@$keys} = @$vals; 

Это даже не намного дольше, но очень маловероятно, чтобы сломать (Это не расщепляется на запятые в кавычках).

+0

Привет .. действительно ценю ваше предложение .. но я не могу использовать perl, поскольку я работаю с базой данных mysql и не имею модуля DBI (установка говорит, что необходим огромный набор зависимостей) Итак, задача под рукой написать сценарий оболочки, который работает с базой данных и .csv .. спасибо –

+0

Итак, у меня огромный скрипт perl .. это был всего лишь фрагмент –

+0

@jakeryan Решение о невозможности установки модулей CPAN является неудачным, но я уверен, что вы работаете под каким-то необычным ограничением, что делает это невозможным (хотя я не могу представить такого ограничения). Если вы не можете использовать Perl, вам может понадобиться изучить Python, это может быть лучше, чем Bash. Моя точка зрения здесь - документы были языковыми. Это общий синтаксис оболочки, в который вы можете включить содержимое файла в свой скрипт. Затем он может быть передан в STDIN команд, например. интерпретатор 'perl'. Мой первый фрагмент кода показывает это (где '...' - это оригинальный скрипт). – amon

Смежные вопросы