-1

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

1 に答える 1

2

もちろん、これをシェル スクリプトに変換することもできます。perl スクリプトをヒアドキュメントでラップし、に渡し、先頭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 に答える