有一个简单的脚本p.pl:
use strict;
use warnings;
our $x;
BEGIN {
$x = 42;
}
print "$x\n";
Run Code Online (Sandbox Code Playgroud)
当我运行它时:
perl -d:Trace p.pl
Run Code Online (Sandbox Code Playgroud)
打印:
>> p.pl:3: our $x;
>> p.pl:7: print "$x\n";
42
Run Code Online (Sandbox Code Playgroud)
如何打印BEGIN块语句,例如$x = 42;?
因为我的意图不明确,加上澄清:
寻找在perl脚本运行时打印语句的任何方法(如Devel :: Trace它),但包括 BEGIN块中的语句.
有一个简单的模块
package Rrr;
use 5.014;
use warnings;
use namespace::sweep;
use Moo;
use Method::Signatures::Simple;
BEGIN {
our $VERSION = '0.0.1';
}
has 'root' => (
is => 'rw',
default => 'root'
);
method func {
say 'This is the func method from ' . __PACKAGE__ . ' with value: ', $self->root;
}
1;
Run Code Online (Sandbox Code Playgroud)
该perlcritic -1说
Code is not tidy at line 1, column 1. See page 33 of PBP. (Severity: 1)
Module does not end with "1;" at line …Run Code Online (Sandbox Code Playgroud) 该普拉克::生成器允许挂接多个主机,例如一些如下面的代码片段:
my @sites = load_site_names();
my $apps;
for my $site (@sites) {
$apps->{$site} = Some::PsgiFramework::MyApp->new( config => get_config($site) );
}
use Plack::Builder;
builder {
for my $site (@sites) {
mount "$site" => $apps->{$site};
}
mount '/' => sub { ... };
}
Run Code Online (Sandbox Code Playgroud)
例如
load_site_names返回站点的列表一样http://example.com,http://some.other.site.com...Some::PsgiFramework::MyApp我完全需要以上内容 - 需要开发一个简单的网络应用程序,该应用程序应该部署在不同(低流量)站点的数据库中,并且不希望为每个站点设置不同的PSGI服务器.
然而,Plack本身的作者说(在Plack :: Request中)
请注意,此模块旨在供Plack中间件开发人员和Web应用程序框架开发人员而非应用程序开发人员(最终用户)使用.
使用Plack :: Request直接编写Web应用程序当然是可行的,但不推荐:它就像使用mod_perl的Apache :: Request那样:但是程度太低.
如果您正在编写Web应用程序而不是框架,那么建议您使用一个支持PSGI的Web应用程序框架(http://plackperl.org/#frameworks),或者查看HTTP :: Engine等模块在PSGI之上提供更高级别的请求和响应API.
这就是问题所在.
我在MetaCPAN中检查了许多不同的基于PSGI的框架.并且AFAIK每个都是基于单一的,例如,不允许写入应用程序可以多次共享(安装)同一个不同的站点app.psgi. …
在这个答案中使用perl one-liner作为:
perl -we '... CORE::say "x=$x"'
Run Code Online (Sandbox Code Playgroud)
使用-e和CORE::say而不是更短的优点是什么:-E和普通的say,例如:
perl -wE '... say "x=$x"'
Run Code Online (Sandbox Code Playgroud) 我需要构建一个简单的Web应用程序.我决定用Poet(Mason2)来做,它使用Plack.
应该允许应用程序仅由经过身份验证的用户使用,因此我需要构建一些登录/密码功能.
已经有一个Plack模块Plack :: Middleware :: Auth :: Basic允许使用Basic用户auth,可以设置检查.htpasswd或类似.但基本身份验证不是很安全; 任何人都可以通过数据包捕获等方式获取登录密码.
以下是两种可能的解决方案
问题:
app.psgiHTTPS.我需要稍微修改一下我的应用程序吗?什么链接显示我如何运行plackuphttps?那么,使用Plack应用程序实现安全身份验证的相对简单方法是什么?
PS:我不关心其余的沟通.我只需要不允许获取密码的安全身份验证.
PPS:https很容易使用apache(和自签名)证书.但我不知道如何使用它plackup(以及任何其他基于Plack的服务器)
我正在寻找Perl中的虚拟文件系统层.无论如何实现实际文件系统,都可以为基本文件系统例程提供一般抽象,例如ls,mkdir等等.
我想要一个这样的界面:
# create a directory "/some/path/tmp" in my current filesystem
my $plainfs = Module::new->(type => 'local', root=>'/some/path);
$plainfs->mdkir("/tmp");
# create "tmp" dir on a remote filesystem
my $sshfs = Module::new->(type=>'ssh', root=>'user:password@example.com:~/pub')
$sshfs->mdkir("/tmp");
Run Code Online (Sandbox Code Playgroud)
我在MetaCPAN上找到了VFS包,遗憾的是只有空的,未实现的模块.
已经实施了什么?现在,我只寻找"本地"文件系统和ftp或ssh-我不需要数据库"文件系统"或任何其他奇特的"文件系统",如CVS左右.搜索20k MetaCPAN模块是痛苦的,没有任何标记系统或类似...
寻找像HTML :: Mason(或Mason)这样的模板引擎,所以将源组件"编译"成perl代码,而不是perl-code将"编译"组件到JavaScript代码中并在用Javascript :: V8运行/执行它们之后perl模块.
动机:寻找安全模板语言的解决方案,可以在不影响服务器安全性的情况下编辑用户.JavaScript是全功能语言,因此使用它可能比TT或类似的某些"迷你语言"更好/更快.对我来说最好的是扩展(重写)Mason编译成Joose/JavaScript而不是Moose/Perl.;)
是的,想要使用Javascript :: V8从perl执行此操作,因为这种方式可以通过Javascript :: V8 $ context-> bind_function以非常安全的方式提供所有perl的功能.
问题:
编辑:在梅森你可以写例如
% #perl version
% my(@list) = qw(Jane John Doe);
<ul>
% foreach my $item (@list) {
<li><% uc($item) %></li>
% }
</ul>
Run Code Online (Sandbox Code Playgroud)
很高兴有可能在JS中编写上述内容,例如:
% //javascript version
% var list = ["Jane", "John", "Doe"];
<ul>
% for(var i in list) {
<li><% perl_uc($list[i]) %></li>
<!-- the "perl_uc" is the real perl uc() what is binded
with Javascript::V8::bind_function(perl_uc => sub { …Run Code Online (Sandbox Code Playgroud) 我有两个来自不同操作系统的Json文件.
两个文件都编码UTF-8并包含UTF-8编码filenames.
一个文件来自OS X,文件名是NFD形式:( od -bc)
0000160 166 145 164 154 141 314 201 057 110 157 165 163 145 040 155 145
v e t l a ? ** / H o u s e m e
Run Code Online (Sandbox Code Playgroud)
第二个包含相同的文件名但以NFC形式:
000760 166 145 164 154 303 241 057 110 157 165 163 145 040 155 145 163
v e t l á ** / H o u s e m e s
Run Code Online (Sandbox Code Playgroud)
据我所知,这被称为"不同的规范化",并且有一个Unicode::Normalize …
今天我开始学习Mojolicious框架.恕我直言,最好的方法是"通过实例学习",所以研究一些"已经完成"的应用程序.因此我下载了Mojolicious-Boilerplate,应该是Mojolicious和Twitter bootstrap的演示.不幸的是它甚至没有开始.
#!/usr/bin/env perl
use Mojo::Base -strict;
use File::Basename 'dirname';
use File::Spec;
push @INC, join('/', File::Spec->splitdir(dirname(__FILE__)), '..', 'lib');
# Check if Mojolicious is installed;
die <<EOF unless eval 'use Mojolicious::Commands; 1';
It looks like you don't have the Mojolicious framework installed.
Please visit http://mojolicio.us for detailed installation instructions.
EOF
# Application
$ENV{MOJO_APP} ||= 'Boilerplate';
# Start commands
Mojolicious::Commands->start;
Run Code Online (Sandbox Code Playgroud)
编辑开始和错误:
$ morbo script/boilerplate
Couldn't load application from file "script/boilerplate": Can't locate object method "start" via package "Mojolicious::Commands" at …Run Code Online (Sandbox Code Playgroud) Plack套件通常使用http://0:port.例如以下内容
plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");'
Run Code Online (Sandbox Code Playgroud)
版画
HTTP::Server::PSGI: Accepting connections at http://0:5000/
Run Code Online (Sandbox Code Playgroud)
但是,LWP::UserAgent(或一些更深层次的模块)不接受它,例如:
perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://0:5000/valid/path");print $res->status_line'
Run Code Online (Sandbox Code Playgroud)
打印:
500 No Host option provided
Run Code Online (Sandbox Code Playgroud)
但是
perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://localhost:5000/valid/path");print $res->status_line'
Run Code Online (Sandbox Code Playgroud)
版画
200 OK
Run Code Online (Sandbox Code Playgroud)
问题是:谁错了?
http://0:port有效的,例如LWP是"错误的"perl ×10
psgi ×3
plack ×2
embedded-v8 ×1
joose ×1
json ×1
lwp ×1
mason ×1
mojolicious ×1
perl-critic ×1
poet ×1
utf-8 ×1
v8 ×1