考虑以下基本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_()内部的@_内容会根据函数的调用方式而改变。
你能解释一下发生了什么吗?
答案 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