2013-08-21 123 views
-1

以下是perl中的代码。 我们可以在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

我确定上述可以在bash中重写。你有尝试过什么吗?如果是的话出了什么问题? – marderh

+1

我想知道你为什么要从Perl转换到shell。 –

回答

2

当然,你可以把这一对shell脚本:只是包装的Perl脚本在这里,DOC,把它传递给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。坚持用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一起使用的shell脚本。谢谢 –

+0

所以,我有一个巨大的Perl脚本..这只是一个片段 –

+0

@jakeryan决定你不能安装CPAN模块是不幸的,但我确定你在一些不寻常的约束条件下运作,这使得这是不可能的(尽管我无法想象这样的约束)。如果你不能使用Perl,你可能想学习一些Python,它可能比Bash更适合。我关于这里的文件的观点是口齿不清。这是一种常用的shell语法,您可以在脚本中包含文件的内容。然后它可以被传递给命令的STDIN,例如, 'perl'解释器。我的第一个代码片段显示了这个(其中'...'是原始脚本)。 – amon