C#中与Perl的$_等价的语法是什么?

5
是否有与Perl的$_函数相当的东西?我正在用C#重写一些旧的perl脚本,但我从未学过任何perl。以下是我正在尝试弄清楚的示例。
sub copyText {
        while($_[0]){
            $_[1]->Empty();
            $_[0] = $_[1]->IsText();
            sleep(1);
         }

3
@cadrell0,在上面的代码中没有使用$_$_[0]$_[1]是数组@_的第一个和第二个元素。@_是传递给子程序的参数列表。@_的元素被别名到实际的参数(通过引用传递),而不是被复制(通过值传递)。 - ikegami
@ikegami这就是我不使用Perl的原因 :). $_[0]引用了数组@_?还是OP的代码有问题? - cadrell0
1
@cadrell0,我不确定你在那个问题中所说的“引用(reference)”是什么意思。在Perl中,数组不是指针,因此不会发生引用。但除此之外,Perl的$a[0]就像C的a[0]一样。数组将使用my @a;声明。my $a;将是标量(NULL(称为undef),字符串,有符号整数,无符号整数,浮点数,引用(包括对象、文件句柄等等))。my %a;将是一个哈希表。 - ikegami
@cadrell0,这是他们在Perl6中改变的东西。大多数其他设计决策实际上非常聪明。你可以说$a[0]评估为标量($)和@a评估为列表(数组(@)类似于列表),但这并不完全成立。 - ikegami
2
@cadrell0,Perl有两种方式来索引数组。它可以检索单个元素($a[$i]),也可以检索多个元素(@a[$i,$j,$k],称为切片)。不同的语法是必需的,因为$a[f()]@a[f()]在不同的上下文中评估f() - ikegami
显示剩余3条评论
2个回答

11

首先,$_ 不是一个函数。它只是一个普通的变量(碰巧被很多内置函数读取和更改)。

其次,你发布的代码并没有使用 $_。它是在访问参数列表中的 @_ 元素。

你发布的代码的更易读版本如下:

sub copyText {
   my ($arg1, $arg2) = @_;
   while ($arg1) {
      $arg2->Empty();
      $arg1 = $arg2->IsText();
      sleep(1);
   }

   $_[0] = $arg1;   # arg1 is passed by reference
}
  • arg1 是一个通过引用传递的布尔值。
  • arg2 是一种具有名为 EmptyIsText 方法的对象。

抱歉,我不懂C#,但希望这可以帮到您。


1
$arg1 可能不是布尔值。在 Perl 中,任何值都可以被评估为真或假。我猜测这是基于名称 IsText 并且它只用作布尔值。 - ikegami
是的,这是一款旧的新闻抓取器,所以我猜这是一个检查,看看它是否捕捉到了错误的东西。 - pyCthon
@Kent Fredric,我提供过了,但我使用的是散文而不是代码,因为copyText($bool, $obj)并不是很描述性。 - ikegami
我不知道我的例子是否正确。在使用前请确保进行更正 =D - Kent Fredric
@Kent Fredric,1)我对涉及的参与方不了解得足够多,无法比我已经了解的更深入地推断出封闭上下文,2)原帖应该已经有调用该函数的代码了,所以这是不必要的。 - ikegami
显示剩余2条评论

0
Perl 的 `$_` 函数
这不是一个函数。它是一个代词,意思是 '它'。
还有另一个特殊变量 `@_`,它是一个代词,意思是 '他们'。
在 C# 中没有类似的东西。

相应地,$[0] 表示它们的第 0 个索引。scalar (@) 返回它们的数量等。 - singingfish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接