小编Håk*_*and的帖子

在使用"严格参考"时,不能使用字符串("1")作为HASH参考

我试图检查是否存在哈希键,例如:

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)

这个错误消息的原因是什么?

perl

5
推荐指数
1
解决办法
2万
查看次数

使用Hash :: Merge将数组合并到数组中

我正在尝试合并包含一个或多个数组的两个哈希值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)

perl

5
推荐指数
1
解决办法
190
查看次数

如何完成相对于另一个目录的文件名?

这是以下讨论的后续问题:

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:完成列表中的目录名称末尾没有添加斜杠(这需要在完成列表中轻松地将目录与文件名分开) …

bash autocomplete

5
推荐指数
1
解决办法
924
查看次数

在交互式bash shell下运行系统命令

我正在尝试~/.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)

bash perl

5
推荐指数
1
解决办法
942
查看次数

如何使用Doxygen和Doxygen :: Filter :: Perl为Perl子例程生成文档?

我试图弄清楚如何使用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 doxygen

5
推荐指数
1
解决办法
2492
查看次数

当用户输入右侧时,使用e //修饰符安全地使用s ///操作符

我正在编写一个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)

regex perl

5
推荐指数
1
解决办法
89
查看次数

在 Perl 6 中使用带有数字的 .unique(:as ...)

文档中,解释了如何在调用之前规范化列表的元素.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)

raku

5
推荐指数
1
解决办法
68
查看次数

使用NativeCall将CStruct中的内联CArray传递到共享库

这是" 如何在Perl 6中声明固定大小的本机数组? " 的后续问题.

在那个问题中讨论了如何将固定大小的数组合并到一个CStruct.在这个答案有人建议使用HAS内联CArrayCStruct.当我测试这个想法时,我遇到了一些在问题下面的评论部分无法解决的奇怪行为,所以我决定把它写成一个新问题.这是我的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)

perl6 nativecall raku

5
推荐指数
1
解决办法
138
查看次数

终端ANSI颜色不适用于Inline :: Perl5(Data :: Printer)

以下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)

perl6 raku

5
推荐指数
1
解决办法
122
查看次数

捕获模块输出

假设我们有这个模块:

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到一个字符串,或者,如果不可能,重定向到一个文件.是这样吗?

io perl6 raku

5
推荐指数
2
解决办法
99
查看次数

标签 统计

perl ×5

raku ×4

perl6 ×3

bash ×2

autocomplete ×1

doxygen ×1

io ×1

nativecall ×1

regex ×1