perl中用于字段分隔符的变量

问题描述

| 用awk我可以写:
awk -F: \'BEGIN {OFS = FS} ...\'
在Perl中,ѭ1等于多少?我想写
perl -F: -lane \'BEGIN {$,= [what?]} ...\'
一个例子更新:
echo a:b:c:d | awk -F: \'BEGIN {OFS = FS} {$2 = 42; print}\'
echo a:b:c:d | perl -F: -ane \'BEGIN {$,= \":\"} $F[1] = 42; print @F\'
输出
a:42:c:d
我宁愿不要在Perl BEGIN块中对ѭ5进行硬编码,而是参考
-F
选项保存其参数的位置。     

解决方法

        总而言之,我正在寻找的东西不存在: 没有变量保存ѭ6的参数,更重要的是 Perl的\“ FS \”本质上是与\“ OFS \”(字符串)不同的数据类型(正则表达式)-使用正则表达式连接字符串列表是没有意义的。 请注意,awk中也是如此:
FS
是一个字符串,但充当正则表达式:
echo a:b,c:d | awk -F\'[:,]\' \'BEGIN {OFS=FS} {$2=42; print}\'
输出\“
a[:,]42[:,]c[:,]d
\” 不过,感谢您的见解和解决方法。     ,        如果您知道输入的确切长度,则可以执行以下操作:
echo a:b:c:d | perl -F\'(:)\' -ane \'$,= $F[1]; @F = @F[0,2,4,6]; $F[1] = 42; print @F\'
如果输入的长度可变,则需要比@f [0,6]更复杂的东西。 编辑:-F似乎只是向自动split()调用提供输入,该调用将完整的RE作为表达式。通过阅读split,perlre和perlvar的perldoc条目,您也许可以找到更合适的东西。     ,        达尼特... 我能做的最好的事情是:
echo a:b:c:d | perl -ne \'$v=\":\";@F = split(\"$v\"); $F[1] = 42; print join(\"$v\",@F) . \"\\n\";\'
这样就不需要ѭ13了,只需要说一次冒号即可。我希望可以像在Awk的
-v
开关中那样在命令行上设置变量。 对于一个衬板,Perl通常不如Awk干净,但是我记得在知道Perl并编写1000多个Awk脚本之前就使用过Awk。 尝试这样的事情使人们认为Awk是以某人在尝试解密这样的脚本时发出的声音来命名的,或者代表AWKward。     ,        您可以作弊,因为perl实际上是将
split
函数与
-F
参数一起使用,并且您可以告诉
split
通过在正则表达式中捕获括号来保留其拆分内容:
$ echo a:b:c:d | perl -F\'(:)\' -ane \'print join(\"/\",@F);\'
a/:/b/:/c/:/d
您可以使用
-MO=Deparse
来查看perl对其中一些“ magic \”命令行参数的处理方式,如下所示:
$ perl -MO=Deparse -F\'(:)\' -ane \'print join(\"/\",@F);\'
LINE: while (defined($_ = <ARGV>)) {
    our(@F) = split(/(:)/,$_,0);
    print join(\'/\',@F);
}
-e syntax OK
您必须将
@F
下标更改为通常的两倍(double22ѭ)。     ,        Perl中没有输入记录分隔符。您基本上是通过使用
-a
-F
标志来模拟awk的。如果您真的不想对值进行硬编码,那为什么不只使用环境变量呢?
$ export SPLIT=\":\"
$ perl -F$SPLIT -lane \'BEGIN { $,= $ENV{SPLIT}; } ...\'