문제

In Perl,를 만드는 것이 가능합니다 전역 변수 문자열을 기반으로?

E.g., 가 같은 기능:

sub create_glob_var {
    my ($glob_var_str) = @_;
    # something like this ( but not a hash access).
    our ${$glob_var_str};
};

고 나라는 다음과 같:

create_glob_var( "bar" );

어떻게 수정 create_glob_var 환성을 유지하는 가장 쉬운 방법이 전역 변수라 $bar?

내 프로젝트가 사용하여 perl5.8.5.

편집

다음과 같은 작동하지 않:

use strict;
BEGIN {
  sub create_glob_var {
    my ($glob_var_str) = @_;
    no strict 'refs';
    $$glob_var_str = undef;  # or whatever you want to set it to
  }

  create_glob_var("bah");
};

$bah = "blah";

생산:

Variable "$bah" is not imported at /nfs/pdx/home/rbroger1/tmp2.pl line 12.
Global symbol "$bah" requires explicit package name at /nfs/pdx/home/rbroger1/tmp2.pl line 12.
Execution of /nfs/pdx/home/rbroger1/tmp2.pl aborted due to compilation errors.

참고 나는 깨닫는 전역 변수를 사용하는 원인 오존층 파괴하고 남성패턴 탈모.하려고 해요 정부는 레거시 코드가 이미 완전히 감염의 사용으로 글로벌 변수입니다.한 리팩터에서 시간...

도움이 되었습니까?

해결책

이전 코드를 정리하려는 경우 필요한 변수를 내보내는 모듈을 작성할 수 있습니다. 호출 할 필요가있을 때마다 create_glob_var, 대신이 패키지에 변수를 추가하여 가져 오기 목록에 넣습니다.

이렇게하면 무슨 일이 일어나고 있는지와 변수가 어떻게 사용되는지 추적하는 데 도움이됩니다.

package MyVars;

use strict; use warnings;

use Exporter 'import';

our($x, %y, @z);

our @EXPORT_OK = qw( $x %y @z );

대본 :

#!/usr/bin/perl

use strict;use warnings;

use MyVars qw( $x %y @z );

$x = 'test';
%y = (a => 1, b => 2);
@z = qw( a b c);

use Data::Dumper;
print Dumper \($x, %y, @z);

산출:

$VAR1 = \'test';
$VAR2 = {
          'a' => 1,
          'b' => 2
        };
$VAR3 = [
          'a',
          'b',
          'c'
        ];

다른 팁

sub create_glob_var {
    my ($glob_var_str) = @_;
    no strict 'refs';
    $$glob_var_str = undef;  # or whatever you want to set it to
}

그만큼 no strict 'refs' 경우에만 필요합니다 use strict 사실상 항상 있어야합니다.

부록:

서브 루틴을 작성하는 방법이 있는지 묻는 경우 create_glob_var 다음 코드가 성공할 수 있도록 :

use strict;
create_glob_var("bar");
$bar = "whatever";

... 그러면 대답은 "아니요"입니다. 그러나 Perl 's vars Pragma는 원하는대로 할 것입니다.

use strict;
use vars qw($bar);
$bar = "whatever";

그러나 이것은 일종의 구식 Perl 코딩입니다. 요즘에는 일반적으로 다음을 수행합니다.

use strict;
our $bar = "blah";

our 나중에 자유롭게 사용할 수있는 전역 변수를 선언 할 수도 있습니다.

our ($foo, @bar, %baz);
# ...
$foo = 5;
@bar = (1, 2, 3);
%baz = (this => 'that');

이 질문을 살펴보십시오.Perl에는 PHP와 같은 동적 변수가 있습니까?

간단히 말해서, 당신이 할 수 있어야하는 것 같습니다 $$glob_var_str = "whatever";

당신은 an을 사용해야 할 것입니다 eval, 그러나 그것은 일반적으로 악으로 간주됩니다. 같은 것 :

eval("$glob_var_str = \@_;");

편집하다

당신은 my 그리고 함께 no strict refs.

그만큼 vars Pragma는 이미 당신이 원하는 것에 대해 무거운 리프팅을하고 있으므로 작동하도록하십시오.

#! /usr/bin/perl

use warnings;
use strict;
use vars;

BEGIN { vars->import(qw/ $bah /) }

$bah = "blah";
print $bah, "\n";

철자를 선호한다면 create_glob_var, 그런 다음 사용하십시오

#! /usr/bin/perl

use warnings;
use strict;
use vars;

sub create_glob_var { vars->import("\$$_[0]") }

BEGIN { create_glob_var "bah" }

$bah = "blah";
print $bah, "\n";

어느 쪽이든, 출력은입니다

blah

이러한 변수를 our. 예, 모든 것을 잡으려면 몇 가지 반복이 필요할 수 있지만, 단기 수정 사항입니다.

일반적으로 변수를 변수 이름으로 사용할 수 있습니다 ( Perlref의 "기호 참조"), 그러나 당신은 정말로, 정말로, 진짜 그렇게하고 싶지 않습니다 : 활성화 strict 'refs' Pragma는이 기능을 비활성화합니다.

Rafael Garcia-Suarez는“원래의 문제가 무엇인지 모르겠지만 해시를 사용하는 것이 좋습니다.”라고 썼을 때 큰 지혜를 보였습니다.

또한보십시오:

대답하여 Sinan Ünür 은 참으로 최고입니다.그러나 이 선택은 내 호기심,그래서 나는 비트의 읽기(수 있 perlmod)고 배운 것에 대해"름을 입력::"해시에 액세스하는 방법으로 네임스페이스의 패키지입니다.

다음 코드를 추가하는 기록하는 기호 테이블의 주요::패키지:

use strict;
my $name = "blah";
my $var = "sss";
$main::{$name} = \$var;

print "$main::blah\n";

이 인쇄"sss".

그러나,나는 추가 패키지 이름을 인쇄하는 문이기 때문에"사용은 엄격한"아직 바보.내가 찾고 계속 사용 변수는 보이지 않는 작동 순간에.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top