获得autosplit分隔符的价值?

时间:2016-02-26 21:00:11

标签: perl command-line-arguments

如果我使用 logger.Get(context).Error(ex.Get(context)); 某些运行脚本,那么某些值是否保存在脚本可以找到它的Perl环境中的任何位置?我想编写一个脚本,默认情况下重用输入分隔符(如果它是一个字符串而不是正则表达式)作为输出分隔符。

2 个答案:

答案 0 :(得分:4)

查看source,我认为分隔符不会保存在任何地方。当你运行

perl -F, -an

词法分析器实际生成代码

LINE: while (<>) {our @F=split(q\0,\0);

并解析它。此时,有关分隔符的任何信息都将丢失。

您最好的选择是手动split

perl -ne'BEGIN { $F="," } @F=split(/$F/); print join($F, @F)' foo.csv

或将分隔符作为参数传递给您的脚本:

F=,; perl -F$F -sane'print join($F, @F)' -- -F=$F foo.csv

或将分隔符作为环境变量传递:

export F=,; perl -F$F -ane'print join($ENV{F}, @F)' foo.csv

答案 1 :(得分:0)

正如@ThisSuitIsBlackNot所说,看起来分隔符保存在任何地方。

这是perl.c存储-F参数

的方式
case 'F':
PL_minus_a = TRUE;
PL_minus_F = TRUE;
    PL_minus_n = TRUE;
PL_splitstr = ++s;
while (*s && !isSPACE(*s)) ++s;
PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
return s;

然后词法分析器生成代码

LINE: while (<>) {our @F=split(q\0,\0);

然而,这当然是编译的,如果你用B :: Deparse运行它,你可以看到存储的内容。

$ perl -MO=Deparse -F/e/ -e ''
LINE: while (defined($_ = <ARGV>)) {
    our(@F) = split(/e/, $_, 0);
}
-e syntax OK

作为perl,总有一种方式,无论多么丑陋。 (这是我在一段时间内编写的一些最丑陋的代码):

use B::Deparse;
use Capture::Tiny qw/capture_stdout/;
BEGIN {
    my $f_var;
}

unless ($f_var) {
    $stdout = capture_stdout {
        my $sub = B::Deparse::compile();
        &{$sub}; # Have to capture stdout, since I won't bother to setup compile to return the text, instead of printing
    };

    my (undef, $split_line, undef) = split(/\n/, $stdout, 3);
    ($f_var) = $split_line =~ /our\(\@F\) = split\((.*)\, \$\_\, 0\);/;
    print $f_var,"\n";  
}

输出:

$ perl -Fe/\\\(\\[\\\<\\{\"e  testy.pl
m#e/\(\[\<\{"e#

您可以遍历字节码,因为每次开始可能都是相同的,直到您到达模式。