我试图检查是否存在哈希键,例如:
use warnings;
use strict;
use feature qw(say);
use Data::Dump qw(dump);
my $h={a=>1,b=>2};
dump($h);
if (exists $h->{a}{b}) {
say "Key exists.";
}
dump($h);
Run Code Online (Sandbox Code Playgroud)
这给出了:
{ a => 1, b => 2 }
Can't use string ("1") as a HASH ref while "strict refs" in use at ./p.pl line 12.
Run Code Online (Sandbox Code Playgroud)
这个错误消息的原因是什么?
我正在尝试合并包含一个或多个数组的两个哈希值Hash::Merge.例如:
use strict;
use warnings;
use feature qw(say);
use Data::Dump qw(dump);
use Hash::Merge qw(merge);
my $h1 = { a => [ { aa => 1 }, 3 ] };
my $h2 = { a => [ { bb => 2 } ] };
my $hLeft = merge( $h1, $h2 );
my $hRight = merge( $h2, $h1 );
say " hLeft: " . dump($hLeft);
say " hRight: " . dump($hRight);
my $hDesired = { a => [ { aa …Run Code Online (Sandbox Code Playgroud) 这是以下讨论的后续问题:
https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1394920
假设我有一个~/tmp包含一些文件和目录的文件夹:
$ mkdir a; touch file1.txt; mkdir a/b; mkdir a/c; touch a/d; mkdir a/b/c
Run Code Online (Sandbox Code Playgroud)
我现在尝试制作一个完成脚本来完成文件名~/tmp,但该complete -o filenames选项只有在当前目录下才能正常工作~/tmp.
有关更多背景信息,请参阅上面的链接.这是我得到的:
$ cat setup
_compTest() {
local cur baseFolder
cur="${COMP_WORDS[$COMP_CWORD]}"
baseFolder=~/tmp
compopt -o nospace
COMPREPLY=( $(
cd "$baseFolder"
if [[ ${cur: -1} != "/" && -d $cur ]] ; then
echo "$cur/"
else
compgen -f "$cur"
fi
) )
}
complete -F _compTest aaa
Run Code Online (Sandbox Code Playgroud)
然后我来源:
$ . setup
Run Code Online (Sandbox Code Playgroud)
然后我就可以了
$ aaa <tab><tab>
Run Code Online (Sandbox Code Playgroud)
问题1:完成列表中的目录名称末尾没有添加斜杠(这需要在完成列表中轻松地将目录与文件名分开) …
我正在尝试~/.bashrc使用该system命令运行一个在Perl中使用别名的命令.它运行命令只运行一次,但是当我运行它两次时,第二次调用作为后台作业运行然后暂停(与按下相同<CTRL-Z>),我必须键入fg以完成命令.例如
use strict;
use warnings;
system ('bash -ic "my_cmd"');
system ('bash -ic "my_cmd"');
Run Code Online (Sandbox Code Playgroud)
第二个呼叫永远不会完成.输出是[1]+ Stopped a.pl.
注意:
my_cmd例如,当用任何其他命令替换时获得相同的结果ls.~/.bashrc文件的内容.我试图从中删除所有内容,问题仍然存在.我使用的是Ubuntu 14.04和Perl版本5.18.2.
更新
为了调试我减少了我~/.bashrc的
echo "Entering ~/.bashrc .."
alias my_cmd="ls"
alias
Run Code Online (Sandbox Code Playgroud)
和我~/.bash_profile的
if [ -f ~/.bashrc ]; then
echo "Entering ~/.bash_profile .."
. ~/.bashrc
fi
Run Code Online (Sandbox Code Playgroud)
现在运行:
system ('bash -lc "my_cmd"');
system ('bash -lc "my_cmd"');
Run Code Online (Sandbox Code Playgroud)
给
Entering ~/.bash_profile ..
Entering ~/.bashrc ..
alias …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用Doxygen::Filter::Perl生成Perl文件的文档.我从一个非常简单的文件开始,看看我是否可以让它工作(test_doxygen.pl):
#! /usr/bin/env perl
#** @file test_doxygen.pl
# @brief Testing Doxygen using Doxygen::Filter::Perl
#
# Description of the purpose of this file
#
# @author Håkon Hægland (hakon.hagland@gmail.com)
#
# @bug No known bugs.
#
#*
#** @class main
# The main class
#*
use strict;
use warnings;
my $b = add_one(1);
#** @function public add_one ($par1)
# @brief A brief description of the function
#
# A detailed description of the function
# @params $par1 …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Perl脚本,用户可以在其中输入正则表达式和替换字符串.该脚本将搜索一组文件,并根据s///应用用户输入的perl 运算符应用更改.
为了使问题稍微复杂化,允许替换字符串包含反向引用以引用正则表达式中的捕获组.例如,如果正则表达式b(.*?)a和替换字符串是a$1b不$1应该按字面意思处理,但rater作为反向捕获第一组.
在这个设置中,我想知道当ee用户输入该s///操作符的右侧时是否可以安全地使用修饰符(以评估用户输入中的反向引用)?例如:
use strict;
use warnings;
my $str = 'abaaca';
my $replacement = 'do{ use Env qw(HOME); unlink "$HOME/important.txt" }';
$str =~ s/a(.*?)a/$replacement/gee;
Run Code Online (Sandbox Code Playgroud)
将是不幸的..但后来我有想法引用用户输入(把它放在一对双引号内)后转义双引号和美元符号(后面没有数字),然后做替换:
use feature qw(say);
use strict;
use warnings;
my $str = 'abaaca';
my $replacement = shift;
$replacement =~ s/\"/\\\"/g;
$replacement =~ s/\$(?!\d)/\\\$/g;
$replacement = '"' . $replacement . '"';
$str =~ s/a(.*?)a/$replacement/gee;
say $str;
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎乍一看,或者我错过了什么?例如,如果调用脚本test.pl并且用户将其运行为:
$ test.pl 'do{ "a$b" …Run Code Online (Sandbox Code Playgroud) 在文档中,解释了如何在调用之前规范化列表的元素.unique:
可选的 :as 参数允许您在唯一化之前规范化/规范化元素。这些值被转换以进行比较,但它仍然是原始值进入结果列表。
并给出了以下示例:
say <a A B b c b C>.unique(:as(&lc)) # OUTPUT: «(a B c)?»
Run Code Online (Sandbox Code Playgroud)
如果我想让有理数列表唯一,只比较它们的整数部分怎么办?我应该如何Int在括号内调用方法:as?
my @a = <1.1 1.7 4.2 3.1 4.7 3.2>;
say @a.unique(:as(?????)) # OUTPUT: «(1.1 4.2 3.1)?»
Run Code Online (Sandbox Code Playgroud)
UPD: 根据@Håkon 的回答,我找到了以下解决方案:
> say @a.unique(:as({$^a.Int}));
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)
或者
> say @a.unique(as => {$^a.Int});
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)
没有它可以做到$^a吗?
UPD2: 是的,它来了!
> say @a.unique(as => *.Int);
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)
或者
> say (3, …Run Code Online (Sandbox Code Playgroud) 这是" 如何在Perl 6中声明固定大小的本机数组? " 的后续问题.
在那个问题中讨论了如何将固定大小的数组合并到一个CStruct.在这个答案有人建议使用HAS内联CArray的CStruct.当我测试这个想法时,我遇到了一些在问题下面的评论部分无法解决的奇怪行为,所以我决定把它写成一个新问题.这是我的C测试库代码:
slib.c:
#include <stdio.h>
struct myStruct
{
int A;
int B[3];
int C;
};
void use_struct (struct myStruct *s) {
printf("sizeof(struct myStruct): %ld\n", sizeof( struct myStruct ));
printf("sizeof(struct myStruct *): %ld\n", sizeof( struct myStruct *));
printf("A = %d\n", s->A);
printf("B[0] = %d\n", s->B[0]);
printf("B[1] = %d\n", s->B[1]);
printf("B[2] = %d\n", s->B[2]);
printf("C = %d\n", s->C);
}
Run Code Online (Sandbox Code Playgroud)
要使用以下方法生成共享库:
gcc -c -fpic slib.c
gcc -shared -o …Run Code Online (Sandbox Code Playgroud) 以下Perl 5脚本:
use strict;
use warnings;
use Data::Printer;
my @a = (1,2,3,4);
p @a;
Run Code Online (Sandbox Code Playgroud)
给出输出:
(注意蓝色),而这个Perl 6脚本:
use Data::Printer:from<Perl5>;
my @a = 1,2,3,4;
p @a;
Run Code Online (Sandbox Code Playgroud)
给出输出:
[
[0] 1,
[1] 2,
[2] 3,
[3] 4
]
Run Code Online (Sandbox Code Playgroud)
但数字没有着色(如上面的Perl 5案例).
系统信息:
$ perl --version
This is perl 5, version 29, subversion 3 (v5.29.3) built for x86_64-linux
$ perl6 -e '.say for $*DISTRO, $*VM, $*PERL.compiler.version'
ubuntu (18.10.Cosmic.Cuttlefish)
moar (2018.11)
v2018.11
Run Code Online (Sandbox Code Playgroud) 假设我们有这个模块:
unit module outputs;
say "Loaded";
Run Code Online (Sandbox Code Playgroud)
我们这样加载它
use v6;
use lib ".";
require "outputs.pm6";
Run Code Online (Sandbox Code Playgroud)
这将打印出"已加载" require.假设我们想要捕获该加载模块的标准输出.我们可以这样做,如果它是一个外部进程,但似乎没有办法重定向*OUT到一个字符串,或者,如果不可能,重定向到一个文件.是这样吗?