2

我是 perl 的新手。

我想说一个变量可以取 2 个值,然后我从另一个函数调用它。

我试过了:

  my(@file) = <${dirname}/*.txt || ${dirname}/*.xml> ;

但这似乎不适用于第二个值,有什么建议吗?

4

5 回答 5

6

<*>运算符用作 fileglob 运算符时,可以使用任何常见的 glob 模式。可用的模式是

  • *(任意数量的任意字符),
  • ?(任何单个字符),
  • {a,b,c}(任何abc模式),

所以你可以做

my @file = glob "$dirname/*.{txt,xml}";

或者

my @file = (glob("$dirname/*.txt"), glob("$dirname/*.xml"));

或者

my @file = glob "$dirname/*.txt $dirname/*.xml";

由于 glob 模式在空白处被拆分为子模式

于 2013-04-30T09:48:12.370 回答
1

如果我理解正确,如果没有找到文件,您想@files回退到第二个选项 ( )。*.xml*.txt

如果是这样,您的语法很接近。它应该是:

my @files = <$dirname/*.txt> || <$dirname/*.xml>;

或者

my @files = glob( "$dirname/*.txt" ) || glob( "$dirname/*.xml" );

此外,检查@files以确保它已填充是一个好主意(如果你没有*.txt或怎么办*.xml?)

warn 'No @files' unless @files;
于 2013-04-30T09:54:23.583 回答
0
my (@file) = (<${dirname}/*.txt>, <${dirname}/*.xml>);
于 2013-04-30T09:48:09.680 回答
0

这有效

my $file = $val1 || $val2;

这意味着将 $file 设置为 $val1,但如果 $val1 为 0 或 false 或 undef,则将 $file1 设置为 $val2

本质上,用变量包围< >意味着要么

1)将其视为文件句柄(例如$read=<$filehandle>

2) 将其用作 shell glob ( 例如@files=<*.xml>)

在我看来,您希望插入值 $dirname 并在末尾添加 .txt 或 .xml 。< > 不会实现这一点

如果您希望向函数发送两个值,那么这可能就是您想要的

my @file=("$dirname.txt","$dirname.xml");

然后用@file调用函数,即myfunction(@file)

在函数中

sub myfunction {
  my $file1=shift;
  my $file2=shift;

所有这些东西都包含在 perldocs perlsub 和 perldata

玩得开心

于 2013-04-30T09:56:43.517 回答
0
my(@file) = <${dirname}/*.txt>, <${dirname}/*.xml> ;

<> 将其转换为文件名数组,因此您实际上是在执行我的@file = @array1,@array2。这将首先遍历 txt 文件,然后遍历 xml 文件。

于 2013-04-30T09:47:51.353 回答