我已经把显示的文件作为脚本的输入,并创建了一个散列。我想把键作为数组,并在匹配后把相应的键值放入数组。
我已经创建了散列,但发现问题,创建数组键和它的值到相应的数组。任何帮助是非常感谢。
预期输出如下
@school = (STRING_x, STRING_y, STRING_z,STRING_k)
@University = (STRING_a, STRING_b, STRING_c)s
@College = (STRING_d, STRING_e, STRING_f)
输入文件
x一个一个一个一个x一个一个二个x
2条答案
按热度按时间b4lqfgs41#
可能是这样的。它分两个阶段处理文件。
第一阶段解析输入数据,提取对我们有用的信息,并将其存储在散列中。散列的键是数组名,散列中的值是包含数组元素的数组引用。
阶段2遍历我们在阶段1中构建的哈希,并将其转化为所需的输出。
**更新:**好了,让我们更详细地看看最后一个循环。
我们有一个哈希值
%data
,它包含了我们从输入文件中解析出来的信息,键是“学校”和“学院”,值是一个数组引用。我们从遍历哈希的键开始,我们可以打印这些键。
注意,每次循环时,变量
$_
都包含一个哈希值的键,因为哈希值是随机排序的,所以每次都以随机顺序返回这些键。您希望键名前面有一个“@",这很简单:
把它放在一个双引号字符串(
"@$_"
)中可能很有诱惑力,但是Perl会把“@”解释为数组变量的开头(这里没有),所以最简单的解决方法是把字符串分成两部分。然后,我们希望字符串具有“=(STUFF)”-所以让我们添加它。
当然,“STUFF”要复杂一些,我们可以从打印散列值开始:
但这并没有给予我们想要的:
这是因为我们有一个数组,reference,所以我们需要解引用它。
这让我们更接近:
但是你要求在列表中的元素之间使用逗号,我们可以使用
join()
来做到这一点,但是我们需要将输出字符串的位分开--因为你不能在字符串中调用函数,如果我们将输出字符串的每一部分放在单独的行中,可能会更容易理解:我们在这里打印四个部分:
1.首字母“@”
1.键名(
$_
)沿着字符串的下一个固定部分1.通过调用
join()
并传递““生成的字符串,以及解引用的数组1.列表末尾的结束符“)”
把这些放在一起,我们得到这个输出:
有一件事我忘了提,我去掉了你的代码,硬编码的输入文件名和打开文件。它更简单,更灵活,只是从命令行读取数据。
它只是从命令行上传递的文件名中读取数据,然后将每一行依次放入
$_
中。我希望这能让事情更清楚。
mzmfm0qo2#
下面是代码的重组版本。
运行将产生以下输出
如果
compilers
的完整列表(即学校、大学、学院)仅在file.txt
中可用,则可以按如下所示修改代码,使其创建一个results
散列,用于存储每个compilers
的数据输出为