Perl弱或强类型?

xcp*_*pat 12 perl typing

我目前正在从learn.perl.org学习Perl 5,我很好奇它的打字系统.我看到有关Perl弱或强类型的混合信息,并且它也是动态类型的.维基百科声称它也支持鸭子打字.

任何人都可以确认它的弱或强类型性质吗?

ike*_*ami 20

我看到有关Perl弱或强类型的混合信息

这并不奇怪.关于C是强类型还是弱类型语言,还存在相互矛盾的信息.

  • 静态但类型语言的一个例子是C. [ 来源 ]

  • C是类型的...... [ 来源 ]

  • 这在C等类型语言中工作正常[ 来源 ]

  • LISP引擎......本身通常用类型语言编写,如C ... [ 来源 ]

  • 在诸如C之类的类型语言中...... [ 来源 ]

  • 类型:类型:(C,Algol,Fortran)[ 来源 ]

Mark J Dominus 编制了上面的列表,并发现有八种不兼容的定义,它们对强类型的含义是什么.

  1. 如果类型注释与变量名称相关联,而不是与值相关联,则强类型语言.如果类型附加到值,则它是弱类型的.

  2. 如果语言包含类型约束违规的编译时检查,则强类型语言.如果检查延迟到运行时间,则它是弱类型的.

  3. 如果语言包含类型约束违规的编译或运行时检查,则强类型语言.如果没有进行检查,则输入为弱类型.

  4. 如果禁止不同类型之间的转换,则强类型语言.如果允许这样的转换,则它是弱类型的.

  5. 如果必须明确指出不同类型之间的转换,则强类型语言.如果执行隐式转换,则它是弱类型的.

  6. 如果没有语言级别的方法来禁用或规避类型系统,则强类型语言.如果有演员表或其他类型规避的机制,则它是弱类型的.

  7. 如果语言具有复杂类型的复杂细粒度类型系统,则会强类型化.如果它只有几种类型,或者只有标量类型,则它是弱类型的.

  8. 如果语言的数据对象类型是固定的并且在对象的生命周期内不变,则该语言是强类型的.如果数据类型可以更改,则语言键入的类型很弱.

这表明"强类型"和"弱类型"是无意义的短语.因此,这个答案的其余部分和所有其他答案实际上只是对你所要求的猜测.


Perl弱或强类型?

它有强类型(标量,数组,散列等)和弱类型(字符串,浮点数,有符号整数,无符号整数,引用等).

这基于上面列表中的定义#1,#2,#4,#5和#6.


维基百科声称它也支持鸭子打字.

方法调用使用动态绑定(duck typing).

这是明确的.


Sob*_*que 5

如果使用'strong typed'的定义,则意味着您指定变量保存的数据类型 - perl不是.

它基本上有一种类型 - 标量 - 可以容纳各种不同的数据类型.Perl根据它的"外观"推断操作的正确性.(它还有哈希和数组 - 这是一组标量)

因为你能:

#!/usr/bin/env perl
use strict;
use warnings;

my $value = 42;

#concat 0 onto the end. 
$value .= 0;
print $value,"\n";
#numeric add
$value += 1;
print $value,"\n";
#division - to create a float.
$value = $value / 4;
print $value,"\n";
#string replacement on a float. 
$value =~ s/\.25//g;
print $value,"\n";
Run Code Online (Sandbox Code Playgroud)

哪个隐含地$value在字符串和数字之间来回转换,它"正常工作" - 我把它称为弱类型.

由于类型不匹配,这些操作......在强类型语言中不起作用(您期望的方式).

有一点值得一提的是上下文的概念.Perl是一种上下文敏感语言,因为它可以从上下文中推断出你的意思.

因此,如果您只是打开并从文件句柄中读取:

open ( my $input, '<', "some_file.txt" ) or die $!;
my $line = <$input>; 
Run Code Online (Sandbox Code Playgroud)

这将读取一行,$input因为它在标量上下文中进行读取.

如果你改为:

my @lines = <$input>; 
Run Code Online (Sandbox Code Playgroud)

因为您正在列表上下文中工作,所以文件的全部内容都会被读入数组@list.

您可以使用显式测试上下文wantarray()(这是一个误称 - 它应该是真的wantlist):

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

sub context_test {

   if ( wantarray() ) {
       return ( "some", "results", "here", "(list context)" );
   }
   else {
      if ( defined wantarray() ) {
          return "some results (scalar context)"; 
      }
      else {
           print "called in a void context\n";
      }
   }
}

my $first = context_test;
print Dumper \$first;

my @second = context_test;
print Dumper \@second;

context_test;
Run Code Online (Sandbox Code Playgroud)

我想我也称这是一个弱类型的例子,因为perl 试图根据上下文找出正确的事情.有时它确实弄错了.

所以你可以:

print "Elements are:", @second, "\n"; # prints elements from the array.
print "Count is", scalar @second,"\n"; #prints number of elements in array.
if ( @second > 2 ) { 
   print "Array \@second has more than 2 elements\n";
}
Run Code Online (Sandbox Code Playgroud)

我提到它的原因是(除了评论)上下文也可能被运营商类型强制.

$first .= @second; #forces scalar context due to concat operation. 
Run Code Online (Sandbox Code Playgroud)