0

私はいくつかの Perl スクリプトといくつかの Perl ワンライナーを含むシェル スクリプトを持っています。シェル スクリプトのほとんどの Perl スクリプトには、最初に oneliner がありますsystem。これらのスクリプトとワンライナーは、共通の入力を受け取る必要があります。では、シェルスクリプトのコマンドラインで引数値を与える方法はありますか???

#!/bin/sh
perl test.pl
perl -ne 'print if/XXXX/ig../ZZZZZ/ig' abc.l > def.l
perl trial.pl
perl qwerty.pl

ここで、たとえばabc.l、oneliner で使用されるファイルがtest.plおよびの共通入力でtrial.plある場合、引数値を使用して、シェル スクリプトの必要なコードで使用されるようにコマンド ラインで指定できますか????

Perl ワンライナーに引数を割り当てようとしましたが、入力が受け入れられませんでした。

私のtest.plコードは次のとおりです

system( q( perl -ne '/^.QQQ/ig && print' abc.l > data1.l) );
system( q( perl -ne '/.SSS/ig && print' data1.l > data2.l) );
open(fh,"<data3.l");
open(fh1,">>data31.l");

while (my $string =<fh>)
{
...
..
..

私の test.pl も同じ入力を取りますabc.l

誰でもこれについて私を助けることができますか?

  1. PerlのワンライナーでARGVを使用するにはどうすればよいですか???
  2. シェルスクリプトの実行中にコマンドラインで入力するにはどうすればよいですか???

前もって感謝します。

4

3 に答える 3

1

Perl は、@ARGV各シェル パラメータの値を含む配列を使用します。

$ perl -e 'print join (":", @ARGV) . "\n" ;' this is a test
this:is:a:test

ご覧のとおり、コマンド ラインのすべての引数は@ARGV.

$ perl -e 'print "$ARGV[2]\n" ;' one two three four
three

これにより、3 番目のパラメーターが出力されます ( @ARGVcount は から始まるため0)。

これはあなたの質問に答えていますか?


補遺

編集:私のtest.plコードは次のとおりです

system( q( perl -ne '/^.QQQ/ig && print' abc.l > data1.l) );
system( q( perl -ne '/.SSS/ig && print' data1.l > data2.l) );
open(fh,"<data3.l");
open(fh1,">>data31.l");

while (my $string =<fh>) {
...

system単純にステートメントを省略して、データを 1 回だけ書き換えてみませんか。

use strict;
use warnings;
use autodie;

open my $input_file, "<", "abc.1";
open my $output_file ">>", "data31.l"
while ( my $string = <$input_file> ) {
    chomp $string;

    # These skip over the lines you don't want
    # No need to "prep" your input first

    next unless $string =~ /^.QQQ/i;
    next unless $string =~ /.SSS/ig;
    # Here be dragons
    say $ouput_file "$something";
}
close $input_file;
close $output_file;

これは理解しやすいです。コマンドに依存する必要がなくなり、system大量の一時ファイルを作成する必要がなくなり、各行を 1 回だけ実行するだけで済むため、はるかに効率的になります。


補遺 II

それは良い考えですが、私はそのようなワンライナーをたくさん持っており、ワンライナーをコードに変換した後に私のコードが機能するかどうかわかりません。

私の理解が正しければ、標準のインラインプログラムを使用する方法が必要です。これは、明らかにカット アンド ペーストでスクリプトに挿入し、4 番目の引数をメインの Perl プログラムに渡します。

答えはノーです。システムコマンドはシェルを生成して、フォークされたプロセスでコマンドを実行します。そのフォークされたプロセスの Perl 変数は、親からアクセスできません。インラインプログラムでPerl 変数を使用でき、それらの変数をメイン プログラムで設定できます。

my $file1 = "data1.1";
my $file2 = "data2.1"
system qq( perl -ne '/^.QQQ/ig && print' abc.l > $file1 );
system qq( perl -ne '/.SSS/ig && print' $file1 >$file2; );

ただし、これが常に行われている場合は、独自のパッケージを作成することを強くお勧めします。

use local::fix_files qw(fix_QQQ fix_SSS);

fix_QQQ ( "abc.1", "data1.1" );
fix_SSS ( "data1.1", "data2.1 );
于 2012-08-21T02:04:17.627 に答える
0

シェルスクリプトの引数は$1、$ 2などです。そのまま使用することも、次のように変数に割り当てることもできます。

FILE=$1
perl trial.pl $FILE
于 2012-08-21T02:07:51.653 に答える
0

$@パラメータを渡すために探していると思います:

設定:

run_me

#!/bin/sh
perl test.pl $@
perl test2.pl $@

test.pl

#!/usr/bin/perl
print "test.pl: @ARGV\n\n";

test2.pl

#!/usr/bin/perl
print "test2.pl: @ARGV\n\n";

実行例:

%> ./run_me foo bar foobar
test.pl: foo bar foobar

test2.pl: foo bar foobar

編集・更新

ここで、たとえば、oneliner で使用されるファイル「abc.l」が test.pl と Trial.pl の共通入力である場合、引数値を使用して、コマンド ラインでそれを指定し、必要な関数で使用できますか?シェルスクリプトのコード????

上記で何が起こっているのか理解していないと思います。"run_me" はシェル スクリプトで、3 つの値 ("foo"、"bar"、"foobar") を渡しています。を使用して、これらの値を perl スクリプトに渡します$@。すべての値を perl スクリプトに渡す代わりに、渡されるパラメーターを指定する場合は、 を使用します。$nここnで、 は整数です。したがって、「bar」を perl スクリプトに渡すには、$2.

あなたの例を考えると:

#!/bin/sh
perl test.pl $1
perl -ne 'print if/XXXX/ig../ZZZZZ/ig' $1 > def.l
perl trial.pl
perl qwerty.pl

スクリプトを呼び出します: ./shell_script abc.1
abc.1test.pl とワンライナーに渡す必要があります

于 2012-08-21T02:27:37.390 に答える