Perl:如何从变量获取awk输出

Perl:如何从变量获取awk输出,perl,Perl,我得到awk的语法错误 value = a|b|c|d|e|F|g|h my $record = `$value | awk -F "|" '{print $5}'`; 谢谢,试试这个: my $record = ( split /\|/, 'a|b|c|d|e|F|g|h' )[4]; 美元价值: 甚至还有这样一个: my ( undef, undef, undef, undef, $record ) = split /\|/, $value; 将外壳化为awk进行拆分,就像根

我得到awk的语法错误

value = a|b|c|d|e|F|g|h 

my $record =  `$value | awk -F "|" '{print $5}'`;
谢谢,

试试这个:

 my $record = ( split /\|/, 'a|b|c|d|e|F|g|h' )[4];
美元价值:

甚至还有这样一个:

my ( undef, undef, undef, undef, $record )  = split /\|/, $value;

将外壳化为awk进行拆分,就像根本不尝试Perl一样

如果您试图从Perl调用awk,那么您几乎肯定是做错了什么。Perl可以做awk所能做的几乎所有事情——而且更高效、更可移植

my $value = 'a|b|c|d|e|F|g|h';

my $record =  (split /\|/, $value)[4]; # 4, not 5 as Perl arrays are zero-indexed

如果在shell提示符下,您将使用以下命令:

echo 'a|b|c|d|e|F|g|h' | awk -F "|" '{print $5}'
但假设Perl的$5未初始化,则执行以下操作:

a|b|c|d|e|F|g|h | awk -F "|" '{print }'
当你注意到命令不起作用时,你没有试着打印出你正在执行的命令吗

修正:

当然,使用split和list切片要简单得多

my $fifth_field = ( split /\|/, $value )[4];

什么错误?你希望得到什么样的结果?你得到了什么?结果我想要e。。它显示awk:cmd。第1行:致命:无法打开文件“a”以读取任何此类文件或目录,并且您是否真的要将字符串用引号括起来?如果您需要错误的解释,那么最好告诉我们错误消息的确切内容。始终使用“严格使用”;使用警告;。它会通知您使用的是Perl的$5,而不是awk的。。。价值是variable@user-文字“a | b | c…”的值仅低于$value。我认为您不需要调用awk。虽然我理解为什么在split模式参数中使用前斜杠被认为是一个好主意,但我必须承认我更喜欢使用split'\\\\',$stringtosplit;在这种特殊情况下。我喜欢避免“牙签倾斜综合症”。但是,我不会在专业代码审查中对此进行争论:-@Sue Spence,split m{\\}和split qr{\\}避免LTS,但不要假装它不是正则表达式pat。@ikegami很难假装它不是正则表达式模式。这只是一种受支持的可读方式,可以为函数提供正则表达式模式。参见perldoc-f分割:-恐怕真的不是天才。非常基本的Perl。
use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote('echo', $value)
   .      ' | '
   .      shell_quote('awk', '-F', '|', '{print $5}');

my $fifth_field = `$cmd`;
my $fifth_field = ( split /\|/, $value )[4];