2016-03-22 12 views
3

私は設定ファイルから読み込むモジュールを持っています。設定ファイルの値を取り出して$ path、$ file、$ hostに格納します。これらの値を新しいサブルーチンに渡して文字列と連結し、それを返そうとすると失敗します。私にエラーを与える:perlの変数と文字列の組み合わせを返します

モジュール:

package Module; 

use strict; 
use Carp; 

# Constructor and initialisation 
sub new {        #class method 
    my $class = shift;    #shift without arguments is shift @_ , takes 1st element of argument array 
    my $self = {};   #created a Hash reference with @_ helping to store values in a hash 
    bless ($self, $class);   #turning self into an object by telling which class it belongs to without hardcode name in 
    $self->{_created} = 1; #syntax for accessing the contemts of a hash: refrence $object_name->{property_name}. 
    return $self; 
} 

#reading from config file 
sub read { 
    my ($self, $file) = @_; 
    my ($line, $section); 
    open(HFILE, "$file") || die "Could not open file '$file' $!"; 
    $self->{_filename} = $file;  # Store a special property containing the name of the file 

    while (chomp (my $line = <HFILE>)) 
    { 
      if ($line =~ /^\[(.*)\]/) 
      { 
        $section = $1; 
      } 
      elsif ($line =~ /^([^=]+)=(.*)/) 
      { 
        my ($config_name, $config_val) = ($1, $2); 
        if ($section) 
          { 
            $self->{"$section.$config_name"} = $config_val; 
          } else { 
            $self->{$config_name} = $config_val; 
            } 
      } 
    } 

    close HFILE; 
    return 1; 
    } 



#fetching values needed 
sub fetch { 
    my ($self, $key) = @_; 
    return $self->{$key}; 
} 

sub _setup{ 
    my ($self, @location) = @_; 
    my $command = ''.$location[1].' --eg-config '.$location[0].' -H "Host:'.$location[2].'" -ik https://'.$location[2].''; 
    return $self->$command; 
} 

スクリプト:あなたはINIファイルを読んでいるので

#!/usr/bin/perl 

use Module; 
use strict; 

my $value = Module->new(); 

$value->read("/Users/hhansraj/git/edgegrid-curl/api.txt") or die "Couldn't read config file: $!"; 
my $path=$value->fetch('location.path'); 
my $file=$value->fetch('location.file'); 
my $host=$value->fetch('credentials.host'); 
$value->_setup($path,$file,$host); 
+1

資格情報を削除します。

このtogeatherを置くことは私たちのようなものを提供します!質問に秘密を公開しないでください。 – sschale

+1

sschaleは十分に明確ではありませんでした。あなたはあなたの資格情報を変更する必要があります。あなたの資格情報は[編集履歴](http:// stackoverflow。com/posts/36144126/revisions)、あなたの質問の元のバージョンはほとんどの場合、すでに検索エンジンと模倣サイトによってキャッシュされています。 – ThisSuitIsBlackNot

答えて

2

、私は強くのようにコンフィグモジュールを使用することをお勧めします: Config::ZOMGまたはConfig::INI

後者は簡単であるべき:

my $config = Config::INI::Reader->read_file('config.ini'); 
print $config->{location}->{file}; 

を武のような適切なOOであなたのコードは次のようになります。

MyClass.pm:

package MyClass; 

use Config::INI::Reader; 

use Moo; 

has 'config_file' => (is => 'ro', required => 1); 
has 'config'  => (is => 'lazy', default => sub { Config::INI::Reader->read_file(shift->config_file); }); 

sub setup { 
    my ($self) = @_; 

    my $path = $self->config->{location}->{path}; 
    my $file = $self->config->{location}->{file}; 
    my $host = $self->config->{credentials}->{host}; 

    return sprintf "%s --eg-config '%s' -H 'Host: %s' -ik https://%s", ($file, $path, $host, $host); 
} 

スクリプト:

use MyClass; 

my $mc = MyClass->new(config_file => 'config.ini'); 
$mc->setup(); 

とにかく、thあなたのファイルの実際の問題は、$commandの内容にちなんで名付けられた$ self上のメソッドを呼び出そうとしていることです。おそらく、ちょうど_setupメソッドで$コマンド変数を返したかったのでしょうか?

1

私は_setupメソッドで実際にコマンドを実行したいと思っています。そのための最善の策はsystem()です。 「システム」を使用するには、戻り値をチェックする必要があり、以前にリンクドキュメントから0です:あなたはしかし、私は非常にあなたが最後のコマンド文字列は正確な方法あなたであることを確認をお勧めしますことを行う前に

Since "SIGINT" and "SIGQUIT" are ignored during the execution 
of "system", if you expect your program to terminate on receipt 
of these signals you will need to arrange to do so yourself 
based on the return value. 

    @args = ("command", "arg1", "arg2"); 
    system(@args) == 0 
     or die "system @args failed: $?" 

それを最初に標準出力にプリントしておきます。これはconfig/setupモジュールの一部であるため、 "testing"などの別の設定オプションを追加することもできます。その後、_setup()が呼び出されると、 "testing"の値に応じてコマンドを印刷するか、実行することができます。

戻り値がゼロでない場合は、何かが間違っていて、同様にがdie()にある可能性があります。しかし、いったんバグを洗い流してしまえば、コマンドの失敗は通常、モジュールユーザーが提供する不正な設定値によって引き起こされることになります。そのため、croak() from the Carp moduleを使用してください(すでにモジュールを使用していることがわかります) 。これは、モジュールの視点ではなく、呼び出し元の視点からの失敗を強調します。

... as above ... 
    bless ($self, $class);  #turning self into an object by telling which ... 
    $self->{_created} = 1;  #syntax for accessing the contemts of a hash: ... 
    $self->{_testing} = 0  # Initialize new config option 
    return $self; 
} 
... etc ... 

sub _setup{ 
    my ($self, @location) = @_; 
    my $command = sprintf("%s --eg-config '%s' -H 'Host: %s' -ik https://%s", 
          @location[1,0,2,2]); 
    if $self->_testing { 
     print "Would have executed: $command\n" 
    } 
    else { 
     system($command) == 0 or croak "system $command failed: $?" 
    } 
} 
関連する問題