如何格式化perl oneliner?

时间:2017-12-07 10:04:00

标签: shell perl

如果我有一个perl one liner从命令行运行它:例如

perl -MData::Dumper -MJSON=decode_json -e 'my @array = @{decode_json($data)}; foreach my $i (@array) { etc }'

我如何格式化它以使其更易读,即添加新行?如果我这样做:

当我添加这样的新行来格式化代码

时,命令会中断

3 个答案:

答案 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