Modulino包名添加到@_

时间:2015-10-16 20:46:01

标签: perl modulino

考虑以下基本Perl modulino:

#!/usr/bin/perl -l
package Toto;

__PACKAGE__->run(@ARGV) unless caller();

sub run 
{
  print "@ARGV";
  print "@_";
}

1;

如果我在命令行上运行它,我会得到:

$ ./Toto.pm 1 2 3
1 2 3
Toto 1 2 3

如果我从测试中调用它:

$ perl -MToto -le 'Toto::run(1,2,3)'    
#first line blank - no ARGV set
1 2 3

换句话说,run_()内部的@_内容会根据函数的调用方式而改变。

你能解释一下发生了什么吗?

2 个答案:

答案 0 :(得分:6)

你的意思是为什么@T中有“Toto”?因为您将其作为类方法调用,所以它隐式地将类作为第一个参数传递。如果您不想这样做,请改为run(@ARGV) unless caller()

答案 1 :(得分:6)

public static class Extensions
{
 public static DataTable ToDataTable(this IEnumerable<EmployeeView> source)
 {
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(
            new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Name"
             }
            );
            dataTable.Columns.Add(
            new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Address"
             }
            );
            dataTable.Columns.Add(
             new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Phone"
             }
            );
            dataTable.Columns.Add(
             new DataColumn()
             {
                 DataType = System.Type.GetType("System.DateTime"),
                 ColumnName = "DateOfHire"
             }
            );

            foreach (var elem in source)
            {
                var row = dataTable.NewRow();
                row["Name"] = elem.Name;
                row["Address"] = elem.Address;
                row["Phone"] = elem.Phone;
                row["DateOfHire"] = elem.DateOfHire;
                dataTable.Rows.Add(row);
            }
      return dataTable;
 }
}

相当于

__PACKAGE__->run(@ARGV)

这是一个类方法调用。方法调用将调用者(Toto->run(1,2,3) 评估的LHS的值)作为第一个参数传递。这与

不同
->

这是一个简单的子调用。以下内容将Toto::run(1,2,3) 称为子:

run