2013-08-21 104 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