在perl IF语句中从shell脚本获取变量

在perl IF语句中从shell脚本获取变量,perl,shell,if-statement,Perl,Shell,If Statement,这是我的后续问题 我想更改行处理的起始索引,比如从第三行开始。我注意到,为了让perl在shell中使用变量,我必须导出变量并在perl中使用$ENV{},请参见: #!/bin/bash t=3 export t perl -e 'print $ENV{t}' perl -lane '$F[3] += sin($F[2]/10 * 4 * atan2 1, 1) if($ENV{t} .. 4); print "@F" 'test.txt > test_new.txt 这里te

这是我的后续问题

我想更改行处理的起始索引,比如从第三行开始。我注意到,为了让perl在shell中使用变量,我必须导出变量并在perl中使用
$ENV{}
,请参见:

#!/bin/bash

t=3 
export t 
perl -e 'print $ENV{t}'
perl -lane '$F[3] += sin($F[2]/10 * 4 * atan2 1, 1) if($ENV{t} .. 4);
print "@F" 
'test.txt > test_new.txt
这里test.txt与前面的问题相同:

A 0.016333 0.003203 0.472723
A 0.016333 0.035228 0.472723
B 0.016333 0.067253 0.472723 
B 0.016333 0.099278 0.472723 
C 0.016333 0.131303 0.472723 
C 0.016333 0.163328 0.472723
但是,
$ENV{t}
根本不起作用:行处理仍然从第一行开始。可能在IF语句中用法不同?? 我应该怎么做才能控制哪一行开始呢?

这是最重要的。用于
(3..4)
的特定规则是

如果标量“.”的任一操作数是常量表达式,则如果该操作数等于(=)当前输入行号($。变量),则该操作数视为真

否则,

只要左操作数为false,则为false。左操作数为真后,范围运算符保持为真,直到右操作数为真,然后范围运算符再次变为假。直到下一次评估range操作符时,它才变为false

当一个端点有一个变量时,将对其进行求值,结果为真。因此,左端始终为真,运算符永远不会为假,所有行都会打印出来

至于如何做到这一点,放弃优雅,明确测试

if $. >= $ENV{t} and $. <= 4

然而,在这一点上,这可能不像正常测试那么清楚,而性能的微小提高(如果有的话)甚至可能无法测量。感谢您提出此问题并提供进一步的评论。

请尝试
if($.>=$ENV{t})
if($a..$b)
对于任何整数值都始终为FALSE。搜索
$。
输入行数
构造
TT=123 perl-lane'$ENV{TT}….'foo.txt也将为您工作。谢谢。“但是有没有办法控制从哪一行开始呢?”詹姆斯我被扯到一边,但至少想回答这个问题。我将在几分钟后添加它。我刚刚用$解决了它。这将是伟大的,如果你知道更好的方式和张贴他们@詹姆斯很高兴看到你解决了这个问题!我也在我的答案中添加了这一点。你认为“更好”的方法是什么?更简洁、更短或……?使用range操作符,它看起来像
if$.==$ENV{t}。。4
#!/bin/bash

t=3  
export t  
perl -e 'print $ENV{t}' 
perl -lane '$F[3] += sin($F[2]/10 * 4 * atan2 1, 1) if(($.>=$ENV{t})&&($.<= 4)); 
print "@F" 'test.txt > test_new.txt
#!/bin/bash

t=3  
export t  
perl -e 'print $ENV{t}' 
perl -lane '$F[3] += sin($F[2]/10 * 4 * atan2 1, 1) if(($.>=$ENV{t})&&($.<= 4)); 
print "@F" 'test.txt > test_new.txt
A 0.016333 0.003203 0.472723
A 0.016333 0.035228 0.472723
B 0.016333 0.067253 0.493849581177725
B 0.016333 0.099278 0.503907047205915
C 0.016333 0.131303 0.472723
C 0.016333 0.163328 0.472723