我必须为一个管道运行修改一些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.
但是,我不太清楚上面的代码是做什么的。如果我理解正确,它会取代每一次出现的' \'使用第[1]行,直到字符串的结尾(由' $ /'表示)。这是对的吗?
我不确定的另一部分是' store'以下的代码。评论。我认为它将数组的哈希值存储到数组中。有人可以解释代码如何工作以及在给定变量的情况下打印出来的内容?另外,如何检索我存储在数组中的数据?
奖金问题:有人可以解释如何修改管道运行的perl脚本吗?
感谢
答案 0 :(得分:1)
s/\/[1]$//;
只会匹配并删除字符串末尾的/ 1。所以在你的例子中它没有影响力。
@{$to_keep{$line[0]}{'1'}}=($line[1],$line[2]);
分解,在你的左侧
$to_keep{'some\one'}{1}
在示例中未定义!但是如果我们说它会给你值foo
,那么你取这个值并替换为@{foo}
,这基本上意味着使用值foo
作为数组名,因此{{1 }}
在右侧,您将@foo
的第二个和第三个元素保存为此变量名称$line
的列表。
如果我们忽略undefined并尝试猜测意图,你会得到一个定义自己的变量名的脚本。使用list的第一个元素作为变量名,并将其设置为等于列表的其余部分