Perl在声明期间使用哈希

Perl在声明期间使用哈希,perl,hash,reference,Perl,Hash,Reference,我想让cflags中的所有项目自动进入cppflags。我该怎么办?以下失败代码: my %conf = ( 'cflags' => ['-g', '-O0'], 'cppflags' => [ @{$conf{cflags}} ], 'bindir' => $PWD . "/bin", ); 抱歉这个愚蠢的问题,我是perl的新手:p.您仍然在构建要分配给%conf的列表,所以还没有分配给%conf,所以尝试从$conf{cflags}读取将

我想让
cflags
中的所有项目自动进入
cppflags
。我该怎么办?以下失败代码:

my %conf = (
    'cflags'   => ['-g', '-O0'],
    'cppflags' => [ @{$conf{cflags}} ],
    'bindir'   => $PWD . "/bin",
);

抱歉这个愚蠢的问题,我是perl的新手:p.

您仍然在构建要分配给
%conf
的列表,所以还没有分配给
%conf
,所以尝试从
$conf{cflags}
读取将是徒劳的

备选案文1:

my @cflags = qw( -g -O0 );
my %conf = (
    cflags   => [ @cflags ],
    cppflags => [ @cflags ],
    bindir   => "$PWD/bin",
);
备选案文2:

my %conf;
$conf{cflags  } = [qw( -g -O0 )];
$conf{cppflags} = [ @{ $conf{cflags} } ];
$conf{bindir  } = "$PWD/bin";
备选案文3:

my %conf = (
    cflags => [qw( -g -O0 )],
    bindir => "$PWD/bin",
);
$conf{cppflags} = [ @{ $conf{cflags} } ];

(按个人偏好的降序排列。)

您仍在构建要分配给
%conf
的列表,因此尚未将任何内容分配给
%conf
,因此尝试从
$conf{cflags}
读取将是徒劳的

备选案文1:

my @cflags = qw( -g -O0 );
my %conf = (
    cflags   => [ @cflags ],
    cppflags => [ @cflags ],
    bindir   => "$PWD/bin",
);
备选案文2:

my %conf;
$conf{cflags  } = [qw( -g -O0 )];
$conf{cppflags} = [ @{ $conf{cflags} } ];
$conf{bindir  } = "$PWD/bin";
备选案文3:

my %conf = (
    cflags => [qw( -g -O0 )],
    bindir => "$PWD/bin",
);
$conf{cppflags} = [ @{ $conf{cflags} } ];

(按个人偏好的降序排列。)

为了跟进池上的回答,这里还有一个建议有一个稍微不同的用例:

my @cflags = qw( -g -O0 );
my %conf = (
    cflags   => \@cflags,
    cppflags => \@cflags,
    bindir   => "$PWD/bin",
);

这与他的#1不同,因为
@cflags
数组以及键
cflags
cppflags
的值都与同一数组相关。更改其中任何一个,其他将反映更改。也许这就是你想要的行为,或者可能不是,或者可能对你没有影响,但事实就是如此。

为了跟进池上的答案,这里还有一个建议有一个稍微不同的用例:

my @cflags = qw( -g -O0 );
my %conf = (
    cflags   => \@cflags,
    cppflags => \@cflags,
    bindir   => "$PWD/bin",
);

这与他的#1不同,因为
@cflags
数组以及键
cflags
cppflags
的值都与同一数组相关。更改其中任何一个,其他将反映更改。也许这是您想要的行为,或者可能不是,或者可能对您没有影响,但事实就是如此。

将标志从cflags复制粘贴到cppflags?或者在后面添加一个赋值,例如
$conf{cppflags}=$conf{cflags}
@TLP copypasting是脏的。第二种方法很好,但是有没有更好的方法,在线?变量初始化。它不是动态的,那么你如何分配任务又有什么关系呢?在创建前不能使用
%conf
中的键,因此必须使用相同的数据或在创建后使用:不能“在线”完成。是否将标记从cflags复制粘贴到cppflags?或者在后面添加一个赋值,例如
$conf{cppflags}=$conf{cflags}
@TLP copypasting是脏的。第二种方法很好,但是有没有更好的方法,在线?变量初始化。它不是动态的,那么你如何分配任务又有什么关系呢?在创建
%conf
中的键之前,您不能使用它们,因此必须使用相同的数据或在创建之后执行:不能“在线”执行。如果可以,我会向您投票两次。可悲的是,我甚至不能给你一次投票(少于15次),所以我可以用一个激励性的评论来代替:D。(事实上,
my$conf
甚至还没有被执行!赋值操作符在它的LHS之前评估它是RHS。这允许类似
my$x=3;{my$x=$x;+$x;比如说$x;#4}比如$x;#3
)关于选项1:任何不执行
cflags=>\@cflags,cppflags=>\@cflags,…
?@JoelBerger:这会起作用,但因为两个哈希值引用同一数组,对其中一个的任何修改也会改变另一个。@Joel Berger,1。那是不一样的,那不是OP做的。2.没有迹象表明OP想把这两者联系起来。(顺便说一句,对于
$conf{cflags}
[{$conf{cflags}}]
的选项2和3,可能会问同样的问题。同样的答案。)如果可以的话,我会投你两次赞成票。可悲的是,我甚至不能给你一次投票(少于15次),所以我可以用一个激励性的评论来代替:D。(事实上,
my$conf
甚至还没有被执行!赋值操作符在它的LHS之前评估它是RHS。这允许类似
my$x=3;{my$x=$x;+$x;比如说$x;#4}比如$x;#3
)关于选项1:任何不执行
cflags=>\@cflags,cppflags=>\@cflags,…
?@JoelBerger:这会起作用,但因为两个哈希值引用同一数组,对其中一个的任何修改也会改变另一个。@Joel Berger,1。那是不一样的,那不是OP做的。2.没有迹象表明OP想把这两者联系起来。(顺便说一句,对于
$conf{cflags}
vs
[{$conf{cflags}}]
,可以对选项2和选项3提出相同的问题。答案相同。)