perl 在Regex Substitute中插值哈希值时遇到问题[关闭]

z8dt9xmd  于 12个月前  发布在  Perl
关注(0)|答案(2)|浏览(106)

已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

11小时前关闭
截至3小时前,社区正在审查是否重新讨论这个问题。
Improve this question
这是完美的工作:

my %hash1 = ( 'key1', 54812); 
  
   print ${hash1}{'key1'};       # prints 54812

字符串
当涉及到这一点:

my %parameters = ( 'ReferenceCode', 00000 );

my $string = q\$parameters{'ReferenceCode'}\; # here i simulate that i read it from .txt file

$string =~ s/\$(\w+)\{'(\w+)'\}/${$1}{'$2'}/g;


当我试图用正则表达式插入字符串时,它给出了这个错误:

Use of uninitialized value in concatenation (.) or string at....


基本上,编译器认为它是空的,但它不是。
我该怎么办?

3htmauhk

3htmauhk1#

符号引用(使用变量名作为引用)只适用于包变量。而且这是一个非常糟糕的主意,这就是为什么我们总是使用use strict;来防止我们自己使用它们(以及其他一些原因)。
一个解决方案:

my %vars = (
   parameters => {
      ReferenceCode => '00000',
   },
);

my $template = q{$parameters{'ReferenceCode'}};

my $output = $template =~ s{
   \$(\w+)\{'(\w+)'\}
}{
   exists( $vars{ $1 } ) && exists( $vars{ $1 }{ $2 } ) 
   ? $vars{ $1 }{ $2 }
   : $&
}xegr;

字符串
请注意,您的模板系统没有任何形式的转义,这是有问题的。您是否考虑过使用现有的模板系统,而不是重新发明轮子?

use Template qw( );

my %vars = (
   parameters => {
      ReferenceCode => '00000',
   },
);

my $template = q{[% parameters.ReferenceCode %]};

my $tt = Template->new();
$tt->process( \$template, \%vars, my $output)
   or die( $tt->error() );

pxiryf3j

pxiryf3j2#

使用eee标志,如下所示。
但是要注意使用eval不安全的。考虑只传递用户输入的键,而不是整个perl变量(或任何代码):

use strict;
use warnings;

my %parameters = ( 'ReferenceCode', 00000 );

my $string;

$string = q\$parameters{'ReferenceCode'}\;
$string =~ s/\$(\w+)\{'(\w+)'\}/$&/eg;
print("$string\n");
# $parameters{'ReferenceCode'}

$string = q\$parameters{'ReferenceCode'}\;
$string =~ s/\$(\w+)\{'(\w+)'\}/$&/eeg;
print("$string\n");
# 0

字符串
这些标志用于:
/e:将REPLACEMENT作为s/PATTERN/REPLACEMENT/中的表达式求值
/ee:将REPLACEMENT作为字符串求值,然后将结果eval

相关问题