您可以推荐哪种Python工具来解析编程语言?它应该允许源内语言语法的可读表示,并且它应该能够扩展到复杂的语言(具有像Python本身那样复杂的语法).
当我搜索时,我主要找到pyparsing,我将评估,但当然我对其他替代品感兴趣.
编辑:奖励点,如果它附带有良好的错误报告和附加到语法树元素的源代码位置.
我正在开发一个大型代码库,每个文件都有不同的缩进约定:制表符,4个空格,3个空格等.
我当前默认选项卡,set shiftwidth=N expandtab smarttab
当我遇到空格缩进文件时,我会这样做,但这很烦人.
Vim或插件中是否有任何功能可以识别,例如,当前缓冲区使用每班三个空格的缩进?
下
use strict;
use warnings;
my $foo = undef;
Run Code Online (Sandbox Code Playgroud)
表达式
$foo . ''
Run Code Online (Sandbox Code Playgroud)
和
"$foo"
Run Code Online (Sandbox Code Playgroud)
都生产
Use of uninitialized value $foo in ... at ...
Run Code Online (Sandbox Code Playgroud)
但是下面的表达式给出了没有警告的空字符串:
$foo x 1
Run Code Online (Sandbox Code Playgroud)
谁知道为什么?我的意思是,有一个很好的字符串化习惯($_ x 1
比defined ? "$_" : ''
它短得多)很酷,但感觉有点奇怪.
Perl通常透明地将数字转换为字符串值,反之亦然.然而,必须有一些东西允许例如Data::Dumper
区分两者,如下例所示:
use Data::Dumper;
print Dumper('1', 1);
# output:
$VAR1 = '1';
$VAR2 = 1;
Run Code Online (Sandbox Code Playgroud)
是否有Perl函数允许我以类似的方式区分标量的值是存储为数字还是字符串?
我在看read
Unix 中的系统调用,至少在Linux中有这个签名:[1]
ssize_t read(int fd, void* buf, size_t count);
Run Code Online (Sandbox Code Playgroud)
假设调用成功(即没有负返回值)和count > 0
(即缓冲区实际上可以存储非零字节量).在哪种情况下会read()
返回0?我能想到以下几点:
fd
引用常规文件并且已到达文件末尾时.fd
指向管道,套接字或FIFO的接收端时,发送端已关闭,管道/套接字/ FIFO自身的缓冲区已用尽.fd
指的是在终端设备的从站侧ICANON
和Ctrl-D
已发送到主侧,而行缓存器是空的.我很好奇是否有其他情况我不知道,哪里read()
会返回0的结果.我特别感兴趣(因为原因)在上面列表中的最后一个情况,read()
返回0一次,但后续read()
对同一FD的调用可能会返回非零结果.如果答案仅适用于Unix的某种风格,我仍然有兴趣听到它.
[1]我知道这个签名是针对libc包装器的,而不是实际的系统调用,但现在这并不重要.
我通常使用zsh,它提供了chpwd()钩子.即:如果cwd被cd builtin更改,zsh会自动调用方法chpwd()(如果存在).这允许设置依赖于cwd的变量和别名.
现在我想把我的.zshrc的这一点移植到bash,但发现bash无法识别chpwd().bash中是否存在类似的功能?我知道重新定义cd工作(见下文),但我的目标是更优雅的解决方案.
function cd()
{
builtin cd $@
chpwd
}
Run Code Online (Sandbox Code Playgroud) Kate编辑器有一个很好的功能:当你保存文件时,它将重新运行其文件类型检测.假设你想在〜/ bin中创建一个新脚本,所以你说
kate ~/bin/myscript
Run Code Online (Sandbox Code Playgroud)
然后输入eg #!/usr/bin/env perl
并保存.在这一刻,凯特将认识到我们正在谈论Perl,并加载语法高亮.
在Vim中,我以为我可以通过自动命令构建类似的东西,但是我坚持使用正在执行的命令.我没有看到重新运行文件类型检测的明确命令.:edit
我可以说它是由它运行的
autocmd BufWritePost * :edit#
Run Code Online (Sandbox Code Playgroud)
但这很粗鲁:特别是.丢失撤消历史记录,光标位置等.是否有更好的解决方案?
在分析期间,我在List :: UtilsBy中遇到了这个函数:
sub rev_nsort_by(&@) {
my $keygen = shift;
my @keys = map { local $_ = $_[$_]; scalar $keygen->( $_ ) } 0 .. $#_;
return map { $_[$_] } sort { $keys[$b] <=> $keys[$a] } 0 .. $#_;
}
Run Code Online (Sandbox Code Playgroud)
rev_nsort_by基于某个键谓词执行反向数字排序,例如:
my @objects = load_objects_from_database();
# sort by rating, highest first
@objects = rev_nsort_by { $_->rating } @objects;
Run Code Online (Sandbox Code Playgroud)
我完全理解为什么rev_nsort_by
,如上所示,按预期工作,但我想知道为什么它如此复杂.具体来说,我想知道原因
my @keys = map { local $_ = $_[$_]; scalar $keygen->( $_ ) } 0 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置临时表以进行单元测试.到目前为止,我设法创建一个复制现有表结构的临时表:
CREATE TEMP TABLE t_mytable (LIKE mytable INCLUDING DEFAULTS);
Run Code Online (Sandbox Code Playgroud)
但这缺乏原始表中的数据.我可以使用CREATE TABLE AS
语句将数据复制到临时表中:
CREATE TEMP TABLE t_mytable AS SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)
但是结构t_mytable
将不相同,例如列大小和默认值不同.是否有一个复制一切的声明?
我在使用第一个查询时遇到的另一个问题LIKE
是,关键字段引用原始表的ID序列,因此在插入时递增它.有没有简单的方法来复制单元测试表的序列,还是我必须手动设置新的序列?
我们正在慢慢地将我们的大型Perl应用程序重构为面向对象的接口,特别是对于数据模型.令人讨厌的部分是堆栈跟踪变得不那么有用.举一个捏造的例子:之前.
sub send_message {
my ($user_id, $message) = @_;
...
Carp::confess('test');
}
# output:
test at example.pm line 23
foo('42', 'Hello World') called at example.pl line 5
Run Code Online (Sandbox Code Playgroud)
后.
sub send_message {
my ($user, $message) = @_;
...
Carp::confess('test');
}
# output:
test at example.pm line 23
foo('MyApp::Model::User=HASH(0x2c94f68)', 'Hello World') called at example.pl line 5
Run Code Online (Sandbox Code Playgroud)
所以现在我看不到传递给哪个用户foo()
,我只看到类名(已经记录)和一个对象的内存地址.
我尝试使用overload.pm在模型类上安装stringification运算符:
use overload ( '""' => \&stringify );
sub stringify {
my ($self) = @_;
return sprintf '%s[id=%d]', ref($self), $self->id;
}
Run Code Online (Sandbox Code Playgroud)
但这并不影响长篇大论.我想要的是这样的:
test …
Run Code Online (Sandbox Code Playgroud) perl ×4
vim ×2
bash ×1
cd ×1
create-table ×1
cwd ×1
debugging ×1
editor ×1
integer ×1
linux ×1
parsing ×1
postgresql ×1
python ×1
sql ×1
stack-trace ×1
string ×1
system-calls ×1
temp-tables ×1
types ×1
undef ×1
unix ×1
warnings ×1
whitespace ×1
zsh ×1