代码之家  ›  专栏  ›  技术社区  ›  sfgroups

如何最好地将参数传递给Perl一行程序?

  •  18
  • sfgroups  · 技术社区  · 14 年前

    我有档案, someFile

    $cat someFile
    hdisk1 active
    hdisk2 active
    

    我使用这个shell脚本来检查:

    $cat a.sh
    #!/usr/bin/ksh
    for d in 1 2
    do
        grep -q "hdisk$d" someFile && echo "$d : ok"
    done
    

    $cat b.sh
    #!/usr/bin/ksh
    export d
    for d in 1 2
    do
        cat someFile | perl -lane 'BEGIN{$d=$ENV{'d'};} print "$d: OK" if /hdisk$d\s+/'
    done
    

    我导出变量 d 在shell脚本中使用 %ENV

    7 回复  |  直到 12 年前
        1
  •  33
  •   Peter Mortensen Sumit Kumar    12 年前

    --

    for d in 1 2 ; do 
      cat someFile | perl -slane ' print "$someParameter: OK" if /hdisk$someParameter\s+/' -- -someParameter=$d; 
    done
    

    请参见: perlrun

        2
  •  5
  •   Peter Mortensen Sumit Kumar    7 年前

    for d in 1 2 ; do cat kk2 | perl -lne ' print "'"${d}"': OK" if /hdisk'"${d}"'\s+/';done
    
        3
  •  4
  •   Peter Mortensen Sumit Kumar    12 年前

    在命令行上传递它,它将在中可用 @ARGV :

    for d in 1 2
    do
      perl -lne 'BEGIN {$d=shift} print "$d: OK" if /hdisk$d\s+/' $d someFile
    done
    

    请注意 shift 运算符删除 ,即 $d

        4
  •  2
  •   Peter Mortensen Sumit Kumar    12 年前

    如果你写一行字有困难,也许写一行字有点难(只是我的意见)。我同意@FM的建议,并用Perl完成整个过程。读入整个文件,然后进行测试:

        use strict;
        local $/ = '' ; # Read in the whole file
        my $file = <> ;
    
        for my $d ( 1 .. 2 )
        {
            print  "$d: OK\n" if  $file =~ /hdisk$d\s+/
        }
    

    请注意,到目前为止所有的Perl示例都将为每个匹配打印一条消息—您能确保没有重复的消息吗?

        5
  •  1
  •   Peter Mortensen Sumit Kumar    12 年前

    perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d='[value]' [file]
    

    d='2-3'
    perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d=$d someFile 
    

    [file]是您的文件名(即, someFile ).

        6
  •  1
  •   Peter Mortensen Sumit Kumar    7 年前

    我的解决方法有点不同。我是用Google搜索你的问题的标题来回答你的问题的,但我正在尝试执行一些不同的操作。这是为了防止它帮助某人:

    仅供参考,我用的是 tcsh 在Solaris上。

    perl -e 'use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*2));'
    

    输出值:

    2013-05-06
    

    我试着把它放到shell脚本中,这样我就可以创建一个文件名中有日期的文件,在过去X天。我试过:

    set dateVariable=`perl -e 'use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*$numberOfDaysPrior));'`
    

    set dateVariable=`perl -e "use POSIX qw(strftime); print strftime('%Y-%m-%d', localtime(time()-3600*24*$numberOfDaysPrior));"`
    

    这对我来说非常有效,不需要借助任何花哨的变量。

    我意识到这并不完全回答你的具体问题,但它回答了标题,可能会帮助其他人!

        7
  •  0
  •   Peter Mortensen Sumit Kumar    12 年前

    看起来不错,但我会用:

    for d in $(seq 1 2); do perl -nle 'print "hdisk$ENV{d} OK" if $_ =~ /hdisk$ENV{d}/' someFile; done