Как мне получить доступ к хешу из другой подпрограммы? - PullRequest
0 голосов
/ 06 апреля 2011

Я пытаюсь создать несколько сценариев для веб-тестирования и использую следующий фрагмент кода для настройки переменных из файла конфигурации:

package setVariables;
sub readConfig{
  open(FH, "workflows.config") or die $!;
  while(<FH>)
  {
    ($s_var, $s_val) = split("=", $_);
    chomp($s_var);
    chomp($s_val);
    $args{$s_var} = $s_val;
    print "set $s_var = $s_val\n";
  } 
  close(FH);
}

, например: var1 = val1 var2 = val2 var3 =val3 и т.д ...

Я хочу иметь возможность передавать значения, установленные этой подпрограммой, подпрограмме в другом пакете.Это то, что у меня есть для пакета, в который я хочу передать его.пакет startTest;использовать setVariables;

sub startTest{
my %args = %setVariables::args;
my $s_var = $setVariables::s_var;
my $s_val = $setVariables::s_var;

setVariables::readConfig(); #runs the readConfig sub to set variables

my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444, 
                                    browser => $args{"browser"}, 
                                    browser_url => $args{"url"} );


$sel->open_ok("/index.aspx");
$sel->set_speed($args{"speed"});
$sel->type_ok("userid", $args{"usrname"});
$sel->type_ok("password", $args{"passwd"});
$sel->click_ok("//button[\@value='Submit']");
$sel->wait_for_page_to_load_ok("30000");
sleep($args{"sleep"});
}

К сожалению, переменные не держатся как есть, и я не знаю, как ссылаться на них.Спасибо за любую помощь.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2011

Ваш код имеет некоторые проблемы. Давайте сначала исправим это.

# Package names should start with upper case unless they are pragmas.
package SetVariables;

# Do this EVERYWHERE.  It will save you hours of debugging.
use strict;
use warnings;

sub readConfig{

  # Use the three argument form of open()
  open( my $fh, '<', "workflows.config") 
    or die "Error opening config file: $!\n";

  my %config;

  # Use an explicit variable rather than $_
  while( my $line = <$fh> )
  {
    chomp $line;    # One chomp of the line is sufficient.
    ($s_var, $s_val) = split "=", $line;

    $config{$s_var} = $s_val;
    print "set $s_var = $s_val\n";
  }

  close $fh;

  return \%config;
}

Тогда используйте так:

use SetVariables;

my $config = SetVariables::readConfig();

print "$_ is $config->{$_}\n" 
  for keys %$config;

Но вместо того, чтобы делать все это самостоятельно, посмотрите на множество модулей конфигурационных файлов на CPAN . Рассмотрим Config :: Any , Config :: IniFiles , Config :: JSON .


В своем комментарии вы отмечаете, что пытаетесь работать с несколькими файлами, основным кодом и парой пакетов.

Один из распространенных шаблонов - это загрузить вашу конфигурацию в ваш основной код и передать ее (или выделить ее элементы) потребляющему коду:

package LoadConfig;

sub read_config {
    my $file = shift;

    my $config;
    # Do stuff to read a file into your config object;

   return $config;
}

1;

Между тем в другом файле:

package DoStuff;

sub run_some_tests {
    my $foo = shift;
    my $bar = shift;

    # Do stuff here

    return;
}

sub do_junk {
    my $config;

    my $foo = $config->{foo};

    # Do junk

    return;
}

1;

А в вашем основном скрипте:

use DoStuff;
use LoadConfig;


my $config = LoadConfig::read_config('my_config_file.cfg');

run_some_tests( $config->{foo}, $config->{bar} );
do_junk( $config );

Итак, в run_some_tests() я извлекаю пару элементов из конфига и передаю их по отдельности. В do_junk() я просто передаю всю конфигурационную переменную.

0 голосов
/ 06 апреля 2011

Я бы предложил использовать обычный формат, такой как YAML , для хранения данных конфигурации. Затем вы можете использовать YAML :: LoadFile , чтобы прочитать ссылку на хэш данных конфигурации и затем использовать ее.

В качестве альтернативы, если вы не хотите использовать YAML или какой-либо другой формат конфигурации с предварительно написанными модулями, вам потребуется, чтобы ваша подпрограмма чтения фактически возвращала либо хэш, либо хэш-ссылку.
Если вам нужна дополнительная справочная информация, посмотрите perlref , perlreftut и perlintro .

0 голосов
/ 06 апреля 2011

Ваши пользователи увидят файл конфигурации или просто программисты? Если это просто программисты, поместите вашу конфигурацию в модуль Perl, а затем используйте use для ее импорта.

Единственная причина использовать файл конфигурации только для программистов, если вы компилируете программу. Так как Perl-программы - это скрипты, не беспокойтесь о разборе файла конфигурации; просто сделай это как Perl.

Если это не для ваших пользователей, а его формат проще, чем в Perl.

PS: уже есть модуль с именем Config. Назовите свой My_config и загрузите его так:

use FindBin '$RealBin';
use lib $RealBin;
use My_config;

См: perldoc FindBin perldoc Config

0 голосов
/ 06 апреля 2011

все, что вам нужно сделать, это собрать переменную в хеш и вернуть ссылку на нее в readConfig:

my %vars = ( var1 => val1,
             var2 => val2,
             var3 => val3,
           );

return \%vars;

и в startTest:

my $set_vars = setVariables::readConfig();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...