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

使用 Getopt::Long 时出现错误“panic: attempts to copy freed scalar”

我收到错误:

panic: attempt to copy freed scalar a121fb4 to a156be8 at ./p.pl line 13.
Run Code Online (Sandbox Code Playgroud)

当我运行以下程序时(p.pl):

use warnings;
use strict;
use Getopt::Long qw(GetOptions);

main(@ARGV);

sub main {
  GetOptions ();

  print "\@ARGV=@ARGV\n";
  my $arg=shift;
}
Run Code Online (Sandbox Code Playgroud)

例如,当使用一个或多个命令行参数时,p.pl 1会出现错误。

这是什么原因呢?

perl

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

使用条件项生成列表

是否可以使用条件项创建数组?

my @a = (1, ($condition) ? 2 : "no-op", 3);
Run Code Online (Sandbox Code Playgroud)

这样"no-op"的功能是这样的,如果$condition是假的,那么我得到列表,(1, 3)但如果$condition是真的,我得到了(1, 2, 3)


背景:

use strict;
use warnings;
use File::Find::Rule;

my $rule = File::Find::Rule->new();
$rule->or(
    $rule->new->name('*.cfg')->prune->discard,
    $rule->directory->name("_private.d")->prune->discard,
    $rule->new->name('*.t')->prune->discard,
    $rule->new->name('*.bak')->prune->discard,
    $rule->new->name('.*.bak')->prune->discard,
    $rule->new->name('.#*')->prune->discard,
);

my @files = $rule->in(".");
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我想包括该行

$rule->directory->name("_private.d")->prune->discard
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我不想排除目录_private.d..

perl

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

如何为可选子例程参数指定默认值?

是否有一种优雅的方法来指定子程序参数的默认值?

目前,我使用以下方法:

use strict;
use warnings;

func1( "arg1", "arg2", opt1 => "first option", opt2 => 0 );

sub func1 {
    my ( $arg1, $arg2, %opt ) = @_;

    $opt{opt1} //= "no option";
    $opt{opt2} //= 1;
    $opt{opt3} //= [];
}
Run Code Online (Sandbox Code Playgroud)

当有很多选择时,它看起来有点难看.我宁愿这样做

sub func2 {
    my ( $arg1, $arg2, $opt ) = process_args( 
        opt1 => "no option", opt2 => 1, opt3 => []
    );
}
Run Code Online (Sandbox Code Playgroud)

我能想出的最好的方法是:

sub func2 {
    my ( $arg1, $arg2, $opt ) = process_args(
        \@_, 2, opt1 => "no …
Run Code Online (Sandbox Code Playgroud)

perl

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

下载CPAN模块分发存档:I18N :: Langinfo

我正在尝试下载模块分发存档I18N::Langinfo:

cpan -g I18N::Langinfo
Run Code Online (Sandbox Code Playgroud)

这给了我一个14兆字节的文件perl-5.22.1.tar.bz2.此存档包含5633个文件,其中子文件夹ext/I18N-Langinfo包含我感兴趣的4个文件.

为什么我还要获取所有其他文件?当我下载模块分发存档时,我希望获得该分发中的文件,我对5629其他文件不感兴趣.

perl

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

如何在Perl脚本中重新加载Bash环境变量?

有没有办法~/.bashrc从Perl脚本中加载Bash环境变量(通过从Bash shell中获取来定义).具体来说,我感兴趣PERL5LIB的是在Perl脚本的调用者不是bash进程1的子进程的情况下重新加载环境变量.在这种情况下,$ENV{PERL5LIB}将不存在,这将阻止我使用我在主目录中安装的任何模块.

第一次尝试可能是bash使用该-l选项重新运行我自己.这将加载~/.bash_profile,我已设置该文件加载~/.bashrc.

#! /usr/bin/env perl

use strict;
use warnings;

if ( !exists $ENV{PERL5LIB} ) {    
    exec 'bash', '-lc', $0, @ARGV;
}
else {
    # Main program starts here..
}
Run Code Online (Sandbox Code Playgroud)

但是这可能会为PERL5LIB未定义的(意外)情况进入无限循环~/.bashrc.

脚注:

[1]当我尝试google-chrome使用Google Chrome扩展API 编写要从流程中调用的本机主机时,我遇到了这种特殊情况.

bash perl

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

从调用者的全局变量中获取变量.什么是框架对象?

检查模块的文档说:

当以下函数返回"帧记录"时,每个记录都是一个命名元组FrameInfo(frame, filename, lineno, function, code_context, index).元组包含框架对象,文件名,当前行的行号,函数名称,源代码中的上下文行列表以及该列表中当前行的索引.

什么是"框架对象"?我希望使用这个框架对象从调用者的角度获取变量的值globals():

import my_util

a=3
my_util.get_var('a')
Run Code Online (Sandbox Code Playgroud)

my_util.py

import inspect

def get_var(name):
    print(inspect.stack()[1][0])
Run Code Online (Sandbox Code Playgroud)

python introspection

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

<.before ...>是什么意思?

在Perl 6中,<.before ... >正则表达式的含义是什么?它似乎意味着<?before ... >:

my $str = "Hello";
$str ~~ /<alpha> <?before 'o'>/;
say $/;
$str ~~ /<alpha> <.before 'o'>/;
say $/;
Run Code Online (Sandbox Code Playgroud)

输出:

?l?
 alpha => ?l?
?l?
 alpha => ?l?
Run Code Online (Sandbox Code Playgroud)

我想澄清一下,因为我看到了一些使用的代码,<.before ...>我不确定它是什么意思.它可能是非法的语法,或者它可能意味着负面的前瞻<!before ...>或积极的前瞻<?before ...>或其他.我知道我可以<alpha>通过在它前面放一个点来制定像非捕获这样的规则<.alpha>,但是对于我来说,因为它们总是无法捕获而对前瞻没有意义.在任何情况下,它应该写<.?before ... ><.!before ... >区分正面和负面的前瞻?

perl6 raku

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

在awk中对数字数组进行排序

如何在awk中对数字数组进行排序?考虑“ sortNum.awk”:

{
    split($0,a," ")
    for (i in a) print a[i]
    print "####"
    asort(a)
    for (i in a) print a[i]
}
Run Code Online (Sandbox Code Playgroud)

echo "4 3 2 1" | awk -f sortNum.awk给予

1
4
3
2
####
4
1
2
3
Run Code Online (Sandbox Code Playgroud)

我正在使用GNU Awk版本3.1.8。

awk gawk

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

如何确定Emacs缓冲区文件名的基本名称?

假设我在Emacs中编辑了t.txt我的主目录中的文件.然后 ESC-: buffer-file-name生成/Home/fcihh/t.txt如何从中提取文件名部分t.txt

根据这个链接,我以为我应该可以写 ESC-: (file-name-base buffer-file-name).但这会产生错误

Lisp error: (void-function file-name-base)
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 12.04上使用GNU Emacs 23.3.1.

emacs

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

用bash中的变量包含的空格传递参数

考虑将一些参数集传递给函数,例如:

awk -vv1="Hello there" -vv2=Bye 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)

请注意,第一个参数包含空格.输出是:

Hello there Bye
Run Code Online (Sandbox Code Playgroud)

现在,我尝试将参数存储在变量中.首先考虑第一个参数中没有空格的情况:

arg="-vv1=Hello -vv2=Bye"
awk $arg 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)

这很好用.现在在变量中插入空格:

arg="-vv1='Hello there' -vv2=Bye"
awk $arg 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)

它给出了错误消息:

awk: there'
awk:      ^ invalid char ''' in expression
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?


更新

根据到目前为止的评论,我想改进我的问题:考虑arg另一个shell脚本的输出的情况.例如,假设这genArg是一个打印字符串的shell脚本:

"-vv1='Hello there' -vv2=Bye"
Run Code Online (Sandbox Code Playgroud)

到终点站.然后arg收集(在脚本中)像

arg=$(genArg)
Run Code Online (Sandbox Code Playgroud)

接下来我想awk用给定的参数调用:

awk $arg 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)

bash awk

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

标签 统计

perl ×5

awk ×2

bash ×2

emacs ×1

gawk ×1

introspection ×1

perl6 ×1

python ×1

raku ×1