Perl:如何从变量获取awk输出
我得到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进行拆分,就像根
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];