请参阅下面的更新
我正在阅读一大堆Perl脚本,我公司的某个人写过这些脚本.他曾经join用来连接字符串.例如,他这样做(从真正的Perl脚本中取出):
$fullpath=join "", $Upload_Loc, "/", "$filename";
Run Code Online (Sandbox Code Playgroud)
而不是这个:
$fullpath = "$Upload_Loc" . "/" . "$filename";
Run Code Online (Sandbox Code Playgroud)
或者就是这样:
$fullpath = "$Upload_Loc/$filename";
Run Code Online (Sandbox Code Playgroud)
他不在了,但是在这里的人告诉我他以这种方式连接字符串,因为它在某种程度上更好.(他们不太清楚为什么).
那么,为什么有人会join在这个问题上使用.连接运算符,或者只是像第三个例子那样键入字符串?这种编码风格是否有正当理由?
我想在这里清理很多乱七八糟的东西,我的第一个想法是结束这种做法.它使代码更难阅读,我确信做一个join不是一种连接字符串的非常有效的方法.然而,虽然自从3.x版以来我一直在用Perl编写脚本,但我并不认为自己是一个大师,因为我从来没有机会和Perl比Perl更好的人和我教我Perl深刻的内心秘密.在我愚弄自己之前,我只是想确保我的直觉在这里是正确的.
我有更好的办法在这里做到这一点.
人们变得困惑.他不只是为了连接路径.这是另一个例子:
$hotfix=join "", "$app", "_", "$mod", "_", "$bld", "_", "$hf", ".zip";
Run Code Online (Sandbox Code Playgroud)
我会在哪里做这样的事情:
$hotfix = $app . "_" $mod . "_" . $bld . "_" . "$hf.zip";
Run Code Online (Sandbox Code Playgroud)
或者,更有可能
$hotfix = "${app}_${mod}_${bld}_${hf}.zip";
Run Code Online (Sandbox Code Playgroud)
或者在这种情况下,我可能实际使用,join因为下划线会导致问题:
$hotfix = join("_", $app, $mod, $bld, $hf) . ".zip";
Run Code Online (Sandbox Code Playgroud)
我的问题仍然是:他是否正在做一些真正的Perl黑客知道的事情,而像我一样只做了15年的新手却不知道?人们看着我使用串联字符串.或者只是将它们放在引号中并说"哈!真是个菜鸟!我敢打赌他也拥有一台Macintosh!"
或者,以前的家伙是否只有一种 …
我有以下代码:
<jar destfile="${jar.file}">
<fileset dir="${basedir}/resources"/>
<include name="META-INF/ejb-jar.xml"/>
<include name="META-INF/persistence-prod.xml"/>
</fileset>
[...]
</jar>
Run Code Online (Sandbox Code Playgroud)
问题是persistence-prod.xm1应该persistence.xml放在罐子里.
我知道我可以创建一个工作目录并在那里布置我的整个jar,然后将其打包.我知道我可以将其中一个文件复制到其他地方并在复制时重命名.如果我有一大堆命名*-prod.xml为重命名的文件*.xml,我可以在复制任务中使用文件映射器.但是,我希望能够在<jar>任务中重命名该文件.我尝试添加<globmapper>到jar任务,但我收到了错误消息:jar doesn't support the nested "globmapper" element.
知道如何在jaring文件时重命名吗?
内置ref($object)和有Scalar::Util blessed($object)什么区别?一个比另一个更受欢迎吗?
use strict;
use warnings;
use Scalar::Util qw(blessed isvstring);
my $object = foo->new();
print "Object is a " . blessed($object) . "\n";
print "Object is a " . ref($object) . "\n";
my $version = 5.00.03;
print "Version is a " . ref(\$version) . "\n";
if (isvstring($version)) {
print "Version is a VSTRING\n";
}
package foo;
sub new {
my $class = shift;
my $self = {};
bless($self, $class);
return $self;
}
Run Code Online (Sandbox Code Playgroud) 目前我这样做
<foreach list="${myfolders}" target="bundle"
param="worksheet" inheritall="true"/>
Run Code Online (Sandbox Code Playgroud)
在文件夹列表上执行目标"bundle".但问题是我需要设置此列表.如何使用Ant来遍历给定父目录的所有文件夹?
如果有办法做到这一点,也排除了更好的特定文件夹.谢谢.
我有一个名为debug我在我的代码中使用的子程序.它基本上可以让我看到发生了什么,等等.
sub debug {
my $message = shift;
my $messageLevel = shift;
our $debugLevel;
$messageLevel = 1 if not defined $messageLevel;
return if $messageLevel > $debugLevel;
my $printMessage = " " x $messageLevel . "DEBUG: $message\n";
print STDERR $printMessage;
return $printMessage;
}
Run Code Online (Sandbox Code Playgroud)
我想要原型,所以我可以做这样的事情:
debug "Here I am! And the value of foo is $foo";
Run Code Online (Sandbox Code Playgroud)
要么
debug "I am in subroutine foo", 3;
Run Code Online (Sandbox Code Playgroud)
同时,我喜欢将子程序定义放在我的程序的底部,所以你不必在代码中用1/2来找到程序的内容.
我想这样做:
sub debug($;$); #Prototype debug subroutine
/Here goes the main program code/
sub debug { …Run Code Online (Sandbox Code Playgroud) 我一直在阅读常春藤文档,我ivysettings.xml对ivy.jar中发现的默认值有疑问.
我想要做的就是将公共存储库更改为我们拥有的本地Maven存储库.而已.我可以将所有ivysettings*.xml文件复制到我的项目中,并用<ivy:settings>它来指向它,但这复制了很多东西.我也可以修改ivy.jar,但这会增加维护难题.开发人员必须使用我的ivy.jar,如果我们转到新版本,我将不得不再次修改它.
那么,我如何保留所有标准常春藤设置并简单地切换存储库以使用?我只是想将我的变化叠加到常春藤已经拥有的东西上.
还有两个问题:
ivyconf*.xml文件和ivysettings*.xml文件之间有什么区别?为什么Ivy中有重复的配置?我对Ivy很新,但已经让它与jar依赖项一起工作了.问题是尝试设置它,所以我可以独立于jar获取javadoc和源.
我有一个简单的测试项目,但无论我在做什么,我都会在其中获取带有类文件的jar.
我有以下ivy.xml文件:
<ivy-module version="1.0">
<info
organisation="com.vegicorp"
module="test"
revision="1.0"
status="release"/>
<configurations>
<conf name="default" visibility="public" extends="runtime,master"/>
<conf name="master" visibility="public"/>
<conf name="compile" visibility="public"/>
<conf name="provided" visibility="public"/>
<conf name="runtime" visibility="public" extends="compile"/>
<conf name="test" visibility="private" extends="runtime"/>
<conf name="system" visibility="public"/>
<conf name="sources" visibility="public"/>
<conf name="javadoc" visibility="public"/>
<conf name="optional" visibility="public"/>
</configurations>
<dependencies>
<dependency org="commons-logging" name="commons-logging" rev="1.1.1"
conf="compile->default"/>
<dependency org="commons-logging" name="commons-logging" rev="1.1.1"
conf="sources->default">
<artifact name="commons-logging" type="sources" ext="jar"/>
</dependency>
<dependency org="commons-logging" name="commons-logging" rev="1.1.1"
conf="javadoc->default">
<artifact name="commons-logging" type="javadoc" ext="jar"/>
</dependency>
</dependencies>
</ivy-module>
Run Code Online (Sandbox Code Playgroud)
以下内容build.xml:
<project name="ivy-test" …Run Code Online (Sandbox Code Playgroud) 当我试图在net beans IDE上构建我的maven应用程序时,我得到了这个错误,请任何帮助我.
Checking for local modifications: skipped.
Executing: cmd.exe /X /C "svn --non-interactive update D:\server"
Working directory: D:\server
Provider message:
The svn command failed.
Command output:
'svn' is not recognized as an internal or external command,
operable program or batch file.
------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 2.070s
Finished at: Mon Dec 17 19:24:19 IST 2012
Final Memory: 15M/175M
------------------------------------------------------------------------
Failed to execute goal org.codehaus.mojo:buildnumber-maven-plugin:1.1:create (default) on project red5-server: Couldn't update project. Error! -> [Help 1]
To see the …Run Code Online (Sandbox Code Playgroud) 我需要打开目录并在创建文件时对文件进行排序.我可以找到一些讨论,使用Perl的标签,排序和文件,根据修改日期对文件进行排序.我认为这是比创建日期排序更常见的需求.我用Perl.之前有一些关于按照Perl以外的其他语言按创建日期排序的帖子,例如php或java.
例如,我需要执行以下操作:
opendir(DIR, $ARGV[0]);
my @files = "sort-by-date-created" (readdir(DIR));
closedir(DIR);
do things with @files...
Run Code Online (Sandbox Code Playgroud)
CPAN在sort命令上有一个页面,但它不是我可以访问的,我在页面上找不到"日期"或"创建"字样.
为了回应编辑,我应该说我使用Mac,OS 10.7.我知道在Finder中,有一个按创建日期选项排序,因此必须有某种指示创建日期以某种方式附加到此系统中的文件.
在回答答案时,以下是尝试对文件进行排序的另一个脚本版本:
#!/usr/bin/perl
use strict; use warnings;
use File::stat; # helps with sorting files by ctime, the inode date that hopefully can serve as creation date
my $usage = "usage: enter name of directory to be scanned for SNP containing lines\n";
die $usage unless @ARGV == 1;
opendir(DIR, $ARGV[0]); #open directory for getting file list
#my @files = (readdir(DIR));
my @file_list = grep ! …Run Code Online (Sandbox Code Playgroud) 我正在阅读使用GNU Make管理项目,并在第2.7章 - 自动依赖关系生成中找到了这个例子.作者从GNU手册中说出了他们:
%.d: %c
$(CC) -M $(CPPFLAGS $< > $@.$$$$; \
sed s',\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)
但是,我能够用这个做同样的事情(注意sed):
-include $(subst .c,.d,$(SOURCES))
%.d: %.c
@$(CC) -M $(CPPFLAGS) $< | sed 's|:| $*.d : |' > $@;
Run Code Online (Sandbox Code Playgroud)
所有这些行都是生成依赖项,然后添加*.d名称.他们不得不改变第一行:
foo.o: bar.h foo.h fubar.h
Run Code Online (Sandbox Code Playgroud)
to foo.o foo.d:bar.h foo.h fubar.h
我更简单,似乎工作得很好,但我认为GNU伙伴有他们sed命令的理由.也:
sed?为什么不简单地将它作为commond line参数我知道GNU的人也可以想到这些,但出于某种原因,选择了更复杂的设置.我只是想了解他们的推理,所以我可以动态地做这些.