-1

以下是 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++;
}
4

1 回答 1

2

当然你可以把它翻译成一个 shell 脚本:只需将 perl 脚本包装在一个 here-doc 中,将它传递给perl,然后放在#!/bin/sh顶部......</p>

#!/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;

它甚至不会更长,但不太可能中断(它不会在引号内的逗号上拆分)。

于 2013-08-21T20:49:29.870 回答