2016-05-13 88 views
-2

我已经看到了几种不同的方式在Perl来声明变量:在声明变量时使用“”和“'和()有什么区别?

my $scalarVar = ""; my $scalarVar = ''; my $scalarVar =(); my $scalarVar; 
my @arrayVar = ""; my @arrayVar = ''; my @arrayVar =(); my @arrayVar; 
my %hashVar = ""; my %hashVar = ''; my %hashVar =(); my %hashVar; 

有什么用""''()之间的区别?

回答

7

""''评估为空字符串。

在标量环境下,()评估为undef。在人们知道它将在标量上下文中评估时,人们会使用undef而不是()

在列表上下文中,()什么都不做。它用作预期表达式的占位符。从概念上讲,它被视为一个空的列表。


当分配给标量时,该值被复制到标量中。

当分配给一个数组时,数组的内容被替换为分配的标量。

分配给散列时,要分配的列表应该是键值对的列表。散列的内容被替换为分配的键值对。创建时


标量是不确定的,和数组和哈希创建空的,所以

my $scalarVar = "";  # Creates a scalar containing an empty string. 
my $scalarVar = '';  # Creates a scalar containing an empty string. 
my $scalarVar = undef; # Creates an undefined scalar. Uselessly noisy code. 
my $scalarVar =();  # Creates an undefined scalar. Uselessly noisy and weird code. 
my $scalarVar;   # Creates an undefined scalar. 

my @arrayVar = "";  # Creates an array containing one scalar (an empty string). 
my @arrayVar = '';  # Creates an array containing one scalar (an empty string). 
my @arrayVar = undef; # Creates an array containing one scalar (undefined). 
my @arrayVar =();  # Creates an empty array. Uselessly noisy code. 
my @arrayVar;   # Creates an empty array. 

my %hashVar = "";  # Warns. Makes no sense since a list of k-v pairs expected. 
my %hashVar = '';  # Warns. Makes no sense since a list of k-v pairs expected. 
my %hashVar = undef; # Warns twice. Makes no sense since a list of k-v pairs expected. 
my %hashVar =();  # Creates an empty hash. Uselessly noisy code. 
my %hashVar;   # Creates an empty hash. 
+0

明白了,非常感谢。 – ssr1012

5

""''是等同的。有些人使用q()作为空字符串,因为''在某些字体中可能看起来像单个",并且会使读者感到困惑。

my $scalarVar =()my $scalarVar是等价的,您可以将my $scalarVar = undef添加到组中。我更喜欢第二种选择,因为它是最短的。

my @arrayVar = ''my @arrayVar = ('')相同,即它创建具有一个元素的数组,即空字符串。 my @arrayVar =()my @arrayVar是等价的,它们创建一个空数组,我更喜欢较短的变体。

对于散列,my %hashVarmy %hashVar =()是等价的(我更喜欢前者)。分配一个空字符串的哈希发出警告:

Odd number of elements in hash assignment at ... 

并且等同于

my %hashVar = ('' => undef); 

即它存储空字符串项下是undef值。

+0

谢谢...你岩石。 – ssr1012

相关问题