2014-01-26 21 views
1

我試圖從一個unix命令輸出到一個文件句柄(它去到一個輸出文件)。最初,我的代碼是這樣的:爲什麼在將unix命令輸出寫入Perl文件時需要列表上下文?

open (OUT,'>',$out)|| die "cannot open $out"; 
my $file =`cut -f $list $in`; 
print OUT $file; 
close OUT; 

它給了我一個「分段錯誤」的錯誤信息,這是一個Perl腳本非常罕見......我搜索周圍,在第二和第三使下面的一個小的變化通過將輸出更改爲數組@file而不是變量$file,並以某種方式,無論出於何種原因,它的工作!

open (OUT,'>',$out)|| die "cannot open $out"; 
my @file =`cut -f $list $in`; 
print OUT @file; 
close OUT; 

有沒有人明白爲什麼它的工作和有什麼區別輸出到數組與標量?

+1

你得到了什麼真正的錯誤信息? – simbabque

+0

分段錯誤 – olala

+0

這不是完整的輸出。 – simbabque

回答

2

qx/readpipe /標量上下文中的反引號將嘗試將外部命令的輸出加載到單個標量變量中。在列表上下文中,輸出被加載到幾個標量列表中。

如果外部命令的輸出非常長,Perl可能會試圖將它塞進一個字符串中,但是在創建幾個小字符串並將它們加載到數組中時可能會出現問題。

+0

這可能是原因!在這個腳本中,它的確處理了一個非常長的字符串(超過幾個G)..我想這可能是它。謝謝! – olala

3

我不能說爲什麼它的工作,但調用標量和列表上下文backticks operator之間的區別是:

    在列表環境
  • qx//將返回的輸出線列表各執$/(在輸入記錄分隔符),但是包括那些行結尾
  • 在標量上下文,它只是返回單個串

下面是一個例子:

use strict; 
use warnings; 
use Data::Dump; 

my $foo = `perl -e "print qq{foo\nbar baz};"`; 
my @bar = `perl -e "print qq{foo\nbar baz};"`; 

dd $foo; 
dd @bar; 

將會產生

"foo\nbar baz" 
("foo\n", "bar baz") 
+0

謝謝!我現在得到了這個,也是在暴徒的回答中提到的,我認爲解釋它 – olala

4

我跑你的初始程序的快速測試:

#! /usr/bin/env perl 
# 
use strict; 
use feature qw(say); 
use warnings; 

my $out = "test.out"; 
my $list = "2"; 
my $in = "test.txt"; 
open OUT,'>',$out || die "cannot open $out"; 
my $file =`cut -f $list $in`; 
print OUT $file; 
close OUT; 

我的測試文件是這樣的:

this that 
who  knows 
who  cares 
I  know 

test.out文件看起來像這樣:

that 
knows 
cares 
know 

如果測試文件不存在,程序仍然運行,並且在STDERR上打印出錯誤cut。如果我給它一個不好的字段規範,程序仍然運行,並且在STDERR上我得到另一個錯誤cut

我已經嘗試了一些東西,但無法讓程序徹底失敗並出現分段錯誤。

所以,問題是什麼是產生分段故障。是cut還是Perl?把my $file = cut -f $ list $放在;print OUT $file;行後面,並看看他們是否打印任何東西。如果他們這樣做,問題是cut,而不是Perl。如果不是,你的Perl解釋器有問題。那麼,問題是爲什麼它可以在我的系統上運行,而不是你的:

  • 你使用的是什麼版本的Perl?
  • 究竟是什麼操作系統?這個Linux,Mac OSX,Cygwin是在Windows下運行,還是一些古老的Solaris/SunOS版本?
  • 這是整個消息嗎?
  • 是否有你的$out文件寫入?

您編寫的程序應該可以在我的系統上運行。我在Mac OS X 10.9上使用Perl 5.14,在Linux RHEL盒子上使用Perl 5.8.8。我沒有在Cygwin上試過這個。

+0

我認爲暴徒的回答可能解釋了它。感謝您的輸入! – olala

+0

它是一個Linux服務器上的perl v5.14.2,當我在一個小測試數據集上運行它時,它工作正常。 – olala

相關問題