2013-08-07 21 views
0

不久,我遇到了一些問題,從Gnuplot本身的Perl腳本中獲取Gnuplot命令的一堵牆。我的主要參考文獻是perlmonks。然後子功能看起來像:從Perl到Gnuplot的管道heredoc

sub binPics { 

my $inFileName = shift; 
my $outFileName = shift; 
my $outputFormatPics = shift; 

open(GP, "| gnuplot") or die "Error while piping to Gnuplot: $! \n"; 
    print GP << " GNU_EOF" 

    plot "$inFileName" u 2 lw 2.5 lc 1 , "" u 3 lw 2.5 lc 2 
    set terminal $outputFormatPics 
    set output '$outFileName.$outputFormatPics' 
    replot 

    GNU_EOF 
} 

在此之後,第二個子功能定義爲一個類似的語法,但不同的Gnuplot命令。我按照我定義的順序調用這些子功能。稍後在腳本中生成的圖片被進一步使用。這會產生錯誤。

那麼這裏有什麼問題,以及可能的運行腳本如何看起來像?

我會給我這個問題的固定腳本,但不能解釋整個heredoc語法。隨時可以這樣做或提出其他建議。

/編輯

縮進不再以SO風格顯示。 heredoc中的行具有製表符作爲第一個命令(來構造代碼)。

回答

1

主要問題是丟失了文件句柄GP。如果沒有關閉,第一個子功能不會引起任何問題(或者更具體一點:後面應該使用的通用圖片在這裏不會產生錯誤),因爲第二個子功能會關閉通話,因爲第二個子功能會導致第二個子功能不可用 - 聲明。但在第二個子功能中,管道未關閉,因此可能導致錯誤。

當您關閉管道時,還需要在print -statement處添加分號。我不知道爲什麼沒有close(GP)的腳本沒有缺少分號的問題,我也不知道標籤縮進是否是一個問題。

儘管如此,這對我的作品,也許有人也有興趣:

sub binPics { 

my $inFileName = shift; 
my $outFileName = shift; 
my $outputFormatPics = shift; 

open(GP, "| gnuplot") or die "Error while piping to Gnuplot: $! \n"; 
print GP << "GNU_EOF"; 

plot "$inFileName" u 2 lw 2.5 lc 1 , "" u 3 lw 2.5 lc 2 
set terminal $outputFormatPics 
set output '$outFileName.$outputFormatPics' 
replot 

GNU_EOF 
close(GP); 
} 
+1

還記得裸字的文件句柄實際上是全局變量的一種形式。如果你已經定義了一個詞法文件句柄,像:'open(my $ gp,「| gnuplot」)',它會在塊結束時超出範圍時自動關閉。 – tjd

+0

啊,這是有道理的,thx!順便說一句。似乎缺少的「close」並不總是這個劇本的問題。 – EverythingRightPlace