首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >推入Perl中的散列末尾

推入Perl中的散列末尾
EN

Stack Overflow用户
提问于 2012-07-20 13:25:38
回答 5查看 3.7K关注 0票数 2

所以我尝试用下面的代码来做的就是推送一个字符串,让我们把"this string“放到散列中每个键的末尾。我完全不知道该怎么做。下面是我的代码:

代码语言:javascript
运行
AI代码解释
复制
use warnings;
use strict;
use File::Find;

my @name;
my $filename;
my $line;
my @severity = ();
my @files;
my @info = ();
my $key;
my %hoa;
my $xmlfile;
my $comment;
my @comments;

open( OUTPUT, "> $ARGV[0]" );
my $dir = 'c:/programs/TEST/Test';

while ( defined( $input = glob( $dir . "\\*.txt" ) ) ) {
    open( INPUT, "< $input" );

    while (<INPUT>) {
        chomp;

        if (/File/) {
            my @line = split /:/;
            $key = $line[1];
            push @{ $hoa{$key} }, "Filename\n";
        }

        if ( /XML/ ... /File/ ) {
            $xmlfile = $1;
            push @{ $hoa{$key} }, "XML file is $xmlfile\n";

        }
        if (/Important/) {
            push @{ $hoa{$key} }, "Severity is $_\n";
        }
        if (/^\D/) {
            next if /Important/;
            push @{ $hoa{$key} }, "Given comment is $_\n";
        }
        push @{ $hoa{$key} }, "this string\n";
    }

}

foreach my $k ( keys %hoa ) {
    my @list = @{ $hoa{$k} };
    foreach my $l (@list) {
        print OUTPUT $l, "\n";
    }
}

}
close INPUT;
close OUTPUT;

其中"this string“是我试图将该字符串推送到数组末尾的位置。然而,最终的结果是它打印了三次"this string“,而不是像我想要的那样打印在每个键的末尾。当我试图将它放在while()循环之外时,它告诉我$key的值没有初始化。所以,有什么帮助吗?如果你需要澄清我的问题,尽管告诉我。谢谢!

EN

回答 5

Stack Overflow用户

发布于 2012-07-20 13:47:52

无意冒犯,但这段代码中有太多问题,我甚至不知道从哪里开始……

首先,“initialization block”(此脚本开头的所有这些my $something; my @somethings行)在Perl中不是必需的。事实上,它不仅仅是“多余的”--它实际上是令人困惑的:每当我遇到一个新的变量时,我不得不来回移动我的焦点,仅仅是为了检查它的类型。此外,即使有了所有这些,$input变量仍然没有声明为本地变量;它要么在注释中丢失,要么给出的代码有遗漏。

其次,为什么你声明你打算使用File::Find (很好)--但又根本不使用它?它可以极大地简化所有这些while(glob) { while(<FH>) { ... } }例程。

第三,我不确定为什么仅当读取的代码行与/File/匹配时才将某些内容赋值给$key -但是在其他所有情况下都使用它的值作为键。这是不是试图读取按部分组织的文件?然后,它可以更简单地完成,通过slurp/拆分或本地化$/变量……

无论如何,重点是如果扫描的文件的第一行与/File/不匹配,则前一行(即来自前一文件!)值被使用了--我不太确定它是不是有意的。如果第一个文件的第一行不是/File/-matched,则使用空字符串作为键-同样,它闻起来像是一个bug……

你能更详细地描述一下你的任务吗?给出一些测试输入/输出结果,也许...在短任务中进行,在进程中组织您的代码将是很棒的。

票数 3
EN

Stack Overflow用户

发布于 2012-07-20 14:47:20

你的程序构思不周,违反了很多好的实践规则。下面是一个具有更好结构的等效程序,而不是全部枚举。

我想知道您是否知道所有的if语句都将被测试并可能被执行?也许您需要使用elsif

除了在使用时$key可能是未定义的,您还将$xmlfile设置为$1,这将永远不会被定义,因为您的任何正则表达式中没有捕获。

从你的代码中不可能知道你想做什么,所以只有当你向我们展示你的输出,输入,并告诉我们如何从一个派生出另一个的时候,我们才能帮助你。

代码语言:javascript
运行
AI代码解释
复制
use strict;
use warnings;

use File::Find;

my ($outfile) = @ARGV;

my $dir = 'c:/programs/TEST/Test';

my %hoa;
my $key;

while (my $input = glob "$dir/*.txt") {

  open my $in, '<', $input or die $!;

  while (<$in>) {

    chomp;

    if (/File/) {
      my $key = (split /:/)[1];
      push @{ $hoa{$key} }, "Filename\n";
    }

    if (/XML/ ... /File/) {
      my $xmlfile = $1;
      push @{ $hoa{$key} }, "XML file is $xmlfile\n";
    }

    if (/Important/) {
      push @{ $hoa{$key} }, "Severity is $_\n";
    }

    if (/^\D/) {
      next if /Important/;
      push @{ $hoa{$key} }, "Given comment is $_\n";
    }

    push @{ $hoa{$key} }, "this string\n";
  }

  close $in;
}

open my $out, '>', $outfile or die $!;

foreach my $k (keys %hoa) {
  foreach my $l (@{ $hoa{$k} }) {
    print $out $l, "\n";
  }
}

close $out;
票数 3
EN

Stack Overflow用户

发布于 2012-07-20 13:47:26

根据您的代码,我怀疑设置了$key的行不会在每次循环中都被调用,并且您不会触发任何其他if语句。

这会将"this string“附加到数组的末尾。根据您在数组末尾得到的3个"this string“,我怀疑有两行没有经过if (/FILE/)或任何其他if语句。这将使$key值保持不变,最后,您将使用设置时$key的最后一个值将"this string“附加到数组中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11580305

复制
相关文章
Salesforce Tableau CRM Dashboards,为查询条件设置默认值
Dashboards查询条件,默认情况下,查询所有担当者的金额情报,如下也可以进行自由选择,选择特定用户的情报。
repick
2022/04/24
1.3K0
MySQL设置字段的默认值为当前系统时间
问题产生: 当我们在对某个字段进行设置时间默认值,该默认值必须是的当前记录的插入时间,那么就将当前系统时间作为该记录创建的时间。 应用场景: 1、在数据表中,要记录每条数据是什么时候创建的,应该由数据库获取当前时间自动记录创建时间。 2、在数据库中,要记录每条数据是什么时候修改的,应该而由数据数据库获取当前时间自动记录修改时间。 实际开发: 记录用户的注册时间、记录用户最后登录时间、记录用户的注销时间等。 实现步骤:(如果使用数据库远程工具则直接设置,更简单!!!) 首先将数据表中字段的数据类型设置为TIM
赵小忠
2018/01/24
9.4K0
如何将Eclipse设置为中文版[通俗易懂]
我们知道Eclipse一个开放源代码的、基于Java的可扩展开发平台,不管学习还是工作都是一款不错的集成开发环境(IDE),但是对于一些初学者看到Eclipse上满满的英文字母可能会感到无从下手,汉化后可能还好点。
全栈程序员站长
2022/08/20
4.2K0
如何将Eclipse设置为中文版[通俗易懂]
如何将EasyCVR通道设置为默认在线?
EasyCVR平台具有强大的数据接入、处理及分发能力,可支持海量视频的轻量化接入与汇聚管理。平台可支持多协议、多类型设备接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等。
TSINGSEE青犀视频
2023/05/19
1.1K0
IntelliJ Idea如何将设置tab设置为4个空格
在阅读Nacos源码时,想提交贡献一些源码,但发现经过本地IDE修改之后,空行处被修改了,这是因为本地使用的tab进行缩进,而Nacos源码使用的是4个空格。
程序新视界
2021/12/07
3.2K0
IntelliJ Idea如何将设置tab设置为4个空格
(四) 如何将socket设置为非阻塞模式
1. windows平台上无论利用socket()函数还是WSASocket()函数创建的socket都是阻塞模式的: SOCKET WSAAPI socket( _In_ int af, _In_ int type, _In_ int protocol ); SOCKET WSASocket( _In_ int af, _In_ int type, _In_ int
范蠡
2018/04/04
4.7K0
如何将MySQL GR 设置为多主模式
在MySQL 5.7.17版本中发布的MySQL Group Replication(后文简称为MGR)被很多人称为MySQL复制方案的正规军,可以一举取代现在的MySQL Replication,Semisynchronous replication,甚至是可以取代之前最成功的MySQL集群方案Galera。 MGR有两种模式,一种是Single-Primary,一种是Multi-Primary,单主或者多主。 在前一种模式Single-Primary中,无论集群中有多少个节点,只有一个节点允许写入,其它
数据和云
2018/03/07
3.9K0
如何将MySQL GR 设置为多主模式
如何将U盘设置为启动盘
1.首先我们将封装好系统的启动u盘插入USB口中,启动电脑.。 2.当显示屏闪过第一个开机画面的时候,我们迅速连续按下键盘上的快捷启动热键,联想为F12,其他品牌按下表自行查询快捷启动热键或联系电脑品牌客服询问。
雾海梦曦
2022/11/12
3.8K0
如何将U盘设置为启动盘
为什么禁止把函数参数默认值设置为可变对象?
有时候我们在编写函数时,会需要给一些参数设置默认值,这个时候我们需要牢记一点:禁止使用可变对象作为参数默认值。
活用数据
2022/10/04
1.4K0
spring @Value 设置默认值
 如果配置文件中没有设置 spring.value.test 在启动的时候讲报错。
ydymz
2018/09/10
5.9K0
为多个平台选择云端配置管理工具
多云模式为企业提出了独特的配置管理挑战。而企业在选择工具时,应仔细比较云原生和第三方选项。 当企业选择迁移到云计算时,配置管理并不会消失。事实上,配置管理在云计算中变得更加重要,特别是当组织使用多个
静一
2018/03/27
1.1K0
为多个平台选择云端配置管理工具
如何将微信地区设置为:日本 我孙子市
先说一个有意思的:微信地区有个很特别的现象,很多地区都是“安道尔”,可以做一个有趣的计算,根据自己好友中安道尔人数占总好友的比例,去乘以使用微信软件总用户的数量,可以得出微信上来自“安道尔”的用户大概有2250万人。
许坏
2020/03/12
3.3K0
如何将页面设置为微信端才能打开
  我们有时候开发一个新项目比较辛苦,不想让别人轻易就能反编译代码,我们可以加一个授权登录,如果不是在微信端登录就会提示“请在微信客户端打开链接”,如下图所示,这就是很多网友说的微信链接无法在pc端打
ytkah
2018/03/06
2K0
如何将页面设置为微信端才能打开
Javascript设置函数参数默认值[ ES6/ES2015总结]
对于js设置函数参数默认值对于绝大多数小伙伴来说,那可以说是相当的简单的,在ES6/ES2015中语法很简单,但是有一些浏览器是不兼容的ES6/ES2015的,或许大家会说我们可以使用babel来编译支持低版本浏览器。
IT工作者
2022/01/26
1.7K0
MySQL字段默认值设置详解
在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默认值相关知识。
MySQL技术
2021/03/04
10.6K0
mysql decimal设置默认值0 无效,设置后自动变为null(navicat设置decimal默认值失效问题)
alter table fa_user alter column money set default 0;
超级小可爱
2023/02/20
6.1K0
jQuery实现Select自动选择默认值
==========================================================================================
IT工作者
2021/12/28
2.2K0
Hive应用:设置字段默认值 原
当我们清理了一些数据之后,数据的某些字段在数据中是没有的但是需要保留这个字段,那么我们将数据插入中转表中时,就需要给这个字段赋予默认值,来让语句正确执行。
云飞扬
2019/03/13
5.3K0
ajaxSetup设置Ajax请求的默认值
ajaxSetup() 方法为将来的 AJAX 请求设置默认值。 语法 $.ajaxSetup({name:value, name:value, ... }) 该参数为带有一个或多个名称/值对的 AJAX 请求规定设置。 下面的表格中列出了可能的名称/值: 名称 值/描述 async 布尔值,表示请求是否异步处理。默认是 true。 beforeSend(xhr) 发送请求前运行的函数。 cache 布尔值,表示浏览器是否缓存被请求页面。默认是 true。 complete(xhr,status) 请求完成
用户1055830
2018/01/18
2.1K0
点击加载更多

相似问题

在WebGL中获取鼠标点击的3D坐标

151

鼠标坐标到游戏坐标WebGL

10

MATLAB:如何从用户单击获取3D坐标?

24

JavaScript/WebGL定期从单击事件到第二个事件获取鼠标坐标

28

获取鼠标单击的坐标

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档