直到最近,我一直在使用相同的键将多个值存储到不同的哈希中,如下所示:
%boss = (
"Allan" => "George",
"Bob" => "George",
"George" => "lisa" );
%status = (
"Allan" => "Contractor",
"Bob" => "Part-time",
"George" => "Full-time" );
Run Code Online (Sandbox Code Playgroud)
然后我可以参考$boss("Bob"),$status("Bob")但如果每个键都有很多属性,这就变得笨拙,我不得不担心保持哈希同步.
有没有更好的方法在哈希中存储多个值?我可以将值存储为
"Bob" => "George:Part-time"
Run Code Online (Sandbox Code Playgroud)
然后拆分拆分弦,但必须有一个更优雅的方式.
需要帮助搞清楚如何做到这一点.我的代码:
my %hash;
$hash{'1'}= {'Make' => 'Toyota','Color' => 'Red',};
$hash{'2'}= {'Make' => 'Ford','Color' => 'Blue',};
$hash{'3'}= {'Make' => 'Honda','Color' => 'Yellow',};
&printInfo(%hash);
sub printInfo{
my (%hash) = %_;
foreach my $key (keys %_{
my $a = $_{$key}{'Make'};
my $b = $_{$key}{'Color'};
print "$a $b\n";
}
}
Run Code Online (Sandbox Code Playgroud) 我试图想出一种初始化哈希的方法,而不必经历一个循环.我希望使用切片,但它似乎没有产生预期的结果.
请考虑以下代码:
#!/usr/bin/perl
use Data::Dumper;
my %hash = ();
$hash{currency_symbol} = 'BRL';
$hash{currency_name} = 'Real';
print Dumper(%hash);
Run Code Online (Sandbox Code Playgroud)
这确实按预期工作并产生以下输出:
$VAR1 = 'currency_symbol';
$VAR2 = 'BRL';
$VAR3 = 'currency_name';
$VAR4 = 'Real';
Run Code Online (Sandbox Code Playgroud)
当我尝试按如下方式使用切片时,它不起作用:
#!/usr/bin/perl
use Data::Dumper;
my %hash = ();
my @fields = ('currency_symbol', 'currency_name');
my @array = ('BRL','Real');
@hash{@array} = @fields x @array;
Run Code Online (Sandbox Code Playgroud)
输出是:
$VAR1 = 'currency_symbol';
$VAR2 = '22';
$VAR3 = 'currency_name';
$VAR4 = undef;
Run Code Online (Sandbox Code Playgroud)
显然有些不对劲.
所以我的问题是:给定两个数组(键和值)初始化哈希的最优雅方法是什么?
我有哈希,其中键的值是其他哈希.
例: {'key' => {'key2' => {'key3' => 'value'}}}
我怎样才能遍历这个结构?
在Perl中,如何创建子目录,同时创建父目录(如果它们不存在)?像UNIX的mkdir -p命令一样?
我想检查Net :: FTP Perl模块中的操作结果而不是死.
通常你会这样做:
$ftp->put($my_file)
or die "Couldn't upload file";
Run Code Online (Sandbox Code Playgroud)
但是我想做其他事情,而不是仅仅死在这个脚本中,所以我尝试了:
$ftp->put($my_file)
or {
log("Couldn't upload $my_file");
return(-1);
}
log("$my_file uploaded");
Run Code Online (Sandbox Code Playgroud)
但是Perl抱怨编译错误说:
syntax error at toto.pl line nnn, near "log"
Run Code Online (Sandbox Code Playgroud)
这是我的代码片段中的第二个日志.
任何建议都非常感谢.
干杯,
我想在perl中编写一个小的"DBQuery"函数,所以我可以使用一行发送一个SQL语句并接收一个哈希数组,即一个记录集.但是,我遇到了Perl语法的问题(可能还有一些奇怪的指针/引用问题),这阻止了我从数据库中获取哈希的信息.下面的示例代码演示了该问题.
我可以使用以下语法从数组中的哈希中获取数据"Jim":
print $records[$index]{'firstName'}
Run Code Online (Sandbox Code Playgroud)
返回"吉姆"
但是如果我首先将数组中的哈希记录复制到它自己的哈希变量中,那么奇怪的是我无法再访问该哈希中的数据:
%row = $records[$index];
$row{'firstName'};
Run Code Online (Sandbox Code Playgroud)
返回""(空白)
以下是显示问题的完整示例代码.任何帮助表示赞赏:
my @records = (
{'id' => 1, 'firstName' => 'Jim'},
{'id' => 2, 'firstName' => 'Joe'}
);
my @records2 = ();
$numberOfRecords = scalar(@records);
print "number of records: " . $numberOfRecords . "\n";
for(my $index=0; $index < $numberOfRecords; $index++) {
#works
print 'you can print the records like this: ' . $records[$index]{'firstName'} . "\n";
#does NOT work
%row = $records[$index];
print 'but not like this: ' . $row{'firstName'} …Run Code Online (Sandbox Code Playgroud) 问题不在于如何告诉oneliner.如果你用一行代码编写代码,你知道你是.但是如何-MMy::Module::Name知道一个模块是从一个oneliner开始的.
这是我的.它虽然是不可移植的,但它依赖于UNIX标准命令(尽管它可以或多或少都可以移植.)
my $process_info = `ps $$ | tail -1`;
my $is_oneliner
= $process_info =~ m/perl.*?\s+-[^\P{IsLower}e]*e[^\P{IsLower}e]*\s+/m
;
Run Code Online (Sandbox Code Playgroud)
如果你有一个时髦的正则表达式,请随意改进我的.
有几个人问我为什么要这样做.brian正确地猜到我想改变导出行为是基于它是否是一个脚本,我们可以假设它已经有了一些设计,或者它是否是用户在单个命令行中尽可能多地尝试做的oneliner.
这听起来很糟糕,因为有这样的信条,出口企业应该尊重其他包-有时被称为" @EXPORT是邪恶的!" 但在我看来,应用于oneliner时这是一种愚蠢的一致性.毕竟Perl本身就是违反其语言结构的方式,并且如果你在命令行上询问它们就会给你简单的循环,我只想将这个想法扩展到我的运营/业务领域.如果它有帮助我甚至想要应用源过滤器(喘息!).
但是这个问题也表明我可能也希望成为Perl的好公民,因为我只是在某些情况下打破社区准则.能够通过更改批处理调度程序中的命令行而不是编写一个全新的模块来创建主要的业务级操作是非常棒的.测试周期大大压缩.
我正在编写一个简单的Perl脚本,它将汇编指令字符串转换为32位二进制代码.
我决定按类型处理翻译分组指令(ADD并且SUB是R-Type指令等等)所以在我的代码中我做的是这样的:
my $bin = &r_type($instruction) if $instruction =~ /^(?:add|s(?:ub|lt|gt))\s/;
Run Code Online (Sandbox Code Playgroud)
因为我要处理add,sub,slt并sgt以同样的方式.
然而我意识到,使用那个正则表达式对于我应该做的任务可能是一个"过度杀伤"...可能是模式
/^(?:add|sub|slt|sgt)\s/
Run Code Online (Sandbox Code Playgroud)
在这种情况下代表更好地使用正则表达式?
非常感谢.
您是否在正则表达式中使用了Perl 5.10回溯控制动词?他们帮助你完成了哪些问题?
就像背景:我做了一些摆弄,但我不能得到任何真正有用的结果.
作为比较,当我开始得到(?>分组所做的事情时,它开始出现在我的正则表达式中.我喜欢将Perl正则表达式世界调整为一组特定假设的想法.随着RE语言越来越有特色,回溯使得RE的表现与他们所依据的精益和平均FSA大相径庭.
当有人可以告诉我RE的其他实现有回溯控制动词 - 而PCRE 没有,我可以承认它属于熟悉正则表达式的人的一般专业领域.这是一个Perl正则表达式问题,帮助人们使用Ruby,Python,C#,Javascript或任何PCRE客户端实现的人可能无法帮助或将其视为他们通常阅读的标签的浪费空间.
perl ×10
hash ×5
arrays ×2
regex ×2
codeblocks ×1
directory ×1
filesystems ×1
mkdir ×1
slice ×1
subroutine ×1
syntax ×1