以下是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++;
}
答案 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;
它甚至不会更长,但不太可能破坏(它不会在引号内的逗号分开)。