脚本从Perl转换为shell

时间:2013-08-21 20:28:25

标签: perl bash shell

以下是perl中的代码。 我们可以在shell脚本中编写相同的东西吗? 如果有,怎么样? 我使用了关联数组但无法实现正在做的事情

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 个答案:

答案 0 :(得分:2)

当然,您可以将其转换为shell脚本:只需将perl脚本包装在here-doc中,将其传递给perl,然后将#!/bin/sh放在顶部......

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

但更严重的是,你可以通过以不同的方式重写代码来实现启发。你正在做的是读取一行,在逗号处拆分,并在每个字段的开头和结尾删除引号:

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。坚持用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;

它甚至不会更长,但不太可能破坏(它不会在引号内的逗号分开)。