1

我必须为管道运行修改一些 Perl 脚本,并编写一个包装脚本以使用给定的一组输入参数运行它们。在我这样做之前,我必须了解第一个程序中发生了什么。我需要帮助来破译这段代码:

# declare and initialise an empty hash
my %to_keep= ();

# an array
@line = ('some\one', 'two', 'three', 'four');

# trim the identifier
$line[0]=~s/\/[1]$//;

# store this into an array
@{$to_keep{$line[0]}{'1'}}=($line[1],$line[2]);
print @;

我熟悉 perl 替换函数,s///。它去:

s/text-regex_to_be_replaced/replacement/modifier. 

但是,我不太确定上面的代码在做什么。如果我理解正确,它将用 line[1] 替换每次出现的“\”,直到字符串的结尾(由“$/”表示)。这个对吗?

我不确定的另一部分是“商店”评论下方的代码。我认为它将数组的哈希存储到数组中。有人可以解释代码是如何工作的以及给定变量它打印出什么吗?另外,如何检索存储在数组中的数据?

额外的问题:有人可以解释为管道运行修改 perl 脚本是如何工作的吗?

谢谢

4

1 回答 1

1

嗯,这是有线的。

s/\/[1]$//; 

只会匹配并删除字符串末尾的 /1 。所以在你的例子中它没有影响。

@{$to_keep{$line[0]}{'1'}}=($line[1],$line[2]);

分解,在左侧你得到 $to_keep{'some\one'}{1}的是示例中未定义的!但是如果我们说它会给你 value foo,那么你取这个 value 并替换 in ,@{foo}这基本上意味着使用 valuefoo作为数组名称,因此@foo.

在右侧,您将 的第二个和第三个元素$line作为列表保存到这个变量名中,@foo.

如果我们忽略未定义并尝试猜测意图,您会得到一个定义自己变量名的脚本。使用列表的第一个元素作为变量名,并将其设置为等于列表的其余部分

于 2012-06-06T21:02:14.487 回答