0

了解しました。質問の見出しは少し混乱するかもしれません。私は実際の問題を以下のコードで再現しました:

プレフィックスとして2つの異なるIPアドレスを持つファイルを作成していますが、特定のIPアドレスプレフィックスを持つファイルのみを一覧表示したいと思います。

プレフィックスとして「10.10.10.10」と「11.11.11.11」を使用してファイルを作成していますが、「10.10.10.10」プレフィックスを使用したファイルのみを一覧表示したいと思います。

これが私のコードです:

#!/usr/bin/perl -w
use strict;

my $ipaddr1 = '10.10.10.10';
for ( my $counter = 1; $counter < 10; $counter++)
{
    my $filename = $ipaddr1."_".$counter.".txt";
    open (my $fh, ">", $filename) or die "$! \n";
}

my $ipaddr2 = '11.11.11.11';
for ( my $counter = 1; $counter < 10; $counter++)
{
    my $filename = $ipaddr2."_".$counter.".txt";
    open (my $fh, ">", $filename) or die "$! \n";
}
print "Done with creating hte files. \n";

print "Lets print the files with only 10.10.10.10 prefix \n";

for my $var ( `ls -1 $ipaddr1_*` )  ### <<< this is the probelm
{
    print $var;
}

出力

Global symbol "$ipaddr1_" requires explicit package name at test.pl line 21.
Execution of test.pl aborted due to compilation errors.

したがって、bashコマンドの実行中にperl変数を解釈できないというエラーを完全に理解しています。

質問

これを達成する方法は?コマンドに明示的なIPアドレスを渡したくないのですls -1が、代わりに、それぞれのIPアドレスを保持する変数を渡したいと思います。

ありがとう。

4

3 に答える 3

3

問題は、Perlがアンダースコア_を変数名の一部として解釈することです。最も簡単な解決策は、これが起こらないように曖昧性解消ブラケットを追加することです。

`ls -1 ${ipaddr1}_*`
于 2013-03-07T10:56:33.963 に答える
2

${ipaddr1}_IlmariKaronenによって与えられた構文は正しい解決策です。改善される可能性のある他のいくつかのことがあります:

  1. Perlがすでに実行できることのために新しいプロセスを開始しないでください。

    for my file (glob "${ipaddr1}_*") {
      print "$file\n";
    }
    

    これもよりポータブルです:)

  2. open my $fh, ">", $filenameそれがファイルを壊してしまうことに注意してください。存在しないファイルのみを作成したいが、コンテンツを壊したくない場合は、>>代わりに追加モードを使用してください。

  3. あなたの人生を楽にして、あなたのコードを短くしてください!ループと範囲を使用します。

    for my $ipaddr ("10.10.10.10", "11.11.11.11") {
      for my $counter (1 .. 9) {
        my $filename = sprintf "%s_%d.txt", $ipaddr, $counter;
        open my $fh, ">", $filename or die "Can't open $filename: $!";
      }
    }
    
于 2013-03-07T13:05:08.377 に答える
1

解決済み:

my $cmd = "ls -1 ". $ipaddr1."_*.txt";
for my $var ( `$cmd` )
{
    print $var;
}
于 2013-03-07T10:19:48.250 に答える