如果我有一个perl one liner从命令行运行它:例如
perl -MData::Dumper -MJSON=decode_json -e 'my @array = @{decode_json($data)}; foreach my $i (@array) { etc }'
我如何格式化它以使其更易读,即添加新行?如果我这样做:
马
当我添加这样的新行来格式化代码
时,命令会中断答案 0 :(得分:6)
写一个真正的perl脚本?
#!/usr/bin/env perl
use strict;
use warnings;
use JSON qw ( decode_json );
my $json = decode_json ( do{ local $/; <> } ); #read from stdin/file specified on command line
foreach my $element ( @$json ) { #iterate
# do things
}
否则 - 您可以在引号之间添加换行符 - 与其他语言不同,它们没有语义意义。
所以:
perl -MData::Dumper -MJSON=decode_json -e '
my @array = @{decode_json($data)};
foreach my $i (@array) { etc }
'
但严重的是 - 如果您正在考虑使一行更具可读性,那么答案就是将其写成脚本,这就是他们所需要的#&# 39; re for&#39;。
答案 1 :(得分:5)
正如其他人已经说过的,如果你的 oneliner 太复杂而无法放入一行,你应该使用一个脚本。
在极少数情况下(以及脚本调试和运行时),您可以将perl脚本内联到bash
脚本中:
#!/bin/bash
# bash function which prints the perl script
perlcode() {
cat - <<'PERLCODE'
use scrict;
use warnings;
# ... rest of your script
PERLCODE
}
#and use the inlined script as
perl <(perlcode)
以上是有效的,因为它使用bash
process substitution机制,首先执行<(...commands...)
中包含的命令,结果的stdout充当临时文件。
因此,perl <(perlcode)
首先执行perlcode
bash函数(它只打印perl源代码),然后在下一步中bash将结果用作
perl /dev/fd/63 #some temporary file descriptor
e.g。与perl /path/to/script
完全一样。这种内联的perl脚本可以作为普通的perl脚本运行,例如也可以包含__DATA__
部分。
您必须使用引用的<< 'HEREDOC'
表单来避免变量扩展。
但实际上,只是因为你可以做上述事情,并不代表你应该。在一些文件中单独使用perl脚本总是好得多。
答案 2 :(得分:0)
这很有趣:你想要一个单行,为了便于阅读,它应该跨越几行行。这听起来像是一种矛盾。
可以做的是放弃-e
开关并制作HERE文档:
perl -MData::Dumper -MJSON=decode_json <<ENDOFPERL
# Your multi-line one-liner goes here
ENDOFPERL