Perl에서 문자열이 비어 있는지 확인하는 적절한 방법은 무엇입니까?


94

이 코드를 사용하여 문자열이 비어 있는지 확인했습니다.

if ($str == "")
{
  // ...
}

같지 않음 연산자도 마찬가지입니다.

if ($str != "")
{
  // ...
}

이것은 작동하는 것처럼 보이지만 (내 생각에) 올바른 방법인지 또는 예기치 않은 단점이 있는지 확실하지 않습니다. 뭔가 옳지 않다고 생각합니다.

답변:


133

Perl에서 문자열을 비교하려면 eq또는 사용하십시오 ne.

if ($str eq "")
{
  // ...
}

==및 !=운영자는 숫자 비교 연산자. 두 피연산자를 비교하기 전에 두 피연산자를 정수로 변환하려고 시도합니다.

자세한 내용은 perlop man 페이지를 참조하십시오.


예, 이것을 사용하면 undef이면주의해야하며 경고를 사용하는 경우 런타임 경고가 표시됩니다. 하지만 경고를 피하는 방법은 여러 가지입니다.
— Evan Carroll

89
  1. 문자열이 Perl에 저장되는 방식으로 인해 문자열 길이를 가져 오는 것이 최적화됩니다.
    if (length $str)문자열이 비어 있지 않은지 확인하는 좋은 방법입니다.

  2. 아직에 대해 보호하지 않은 상황에있는 경우 undef경고하지 않는 "비어 있지 않은"항목은 if (defined $str and length $str).


6
길이는 문자열에 아무것도 없다는 생각의 표현에 가장 가까운 테스트라고 생각합니다.
— brian d foy 2010 년

6
if (length($str))좋은 접근 방식이며 변수가 정의되지 않은 경우 실패하지 않기 때문에 찬성되었습니다 .
— basic6

10

"=="대신 "eq"를 사용하고 싶을 것입니다. 일부 예외적 인 경우에 대해 걱정하는 경우 정의되지 않은 항목도 확인해야 할 수 있습니다.

if (not defined $str) {

# this variable is undefined

}

1
0 요소를 가질 수있는 배열을 이동하여 문자열을 얻을 때 매우 유용합니다.
— Dacav

9

이미 여러 사람이 언급했듯이 eq 했듯이은 여기에서 올바른 연산자입니다.

use warnings;스크립트에있는 경우 이에 대한 경고 (및 기타 많은 유용한 정보)가 표시됩니다. 나도 추천 use strict;합니다.


+1 Cool, 예, 일반적으로 사용 use strict하지만 이전 코드를 업데이트하고 있으므로 이것을 추가하면 수백 개의 오류가 발생합니다. 아마도 언젠가 고칠 것입니다.
— Nick Bolton

4

CPAN을 사용하는 것 외에 어떤 일을하는 "적절한"방법이라는 개념은 Perl에 존재하지 않습니다.

어쨌든 그것들은 숫자 연산자입니다.

if($foo eq "")

또는

if(length($foo) == 0)

3
Perl이 문제 해결을 위해 "하나의 진정한 방법"을 옹호하지 않는 것은 사실이지만, 그렇다고 강력하게 선호하는 관용구와 스타일 및 접근 방식이 없다는 의미는 아닙니다. 또한 Perl 단골 직원 중 한 명이 말을 많이하기를 좋아하기 때문에 일을 할 수 있는 방법이 여러 가지 가 있더라도 일을하는 어떤 방법은 정말, 정말 나쁩니다 (어리 석고, 잘못 조언하고, 유지하기 어려운 등) .)
— Telemachus

2
할 수있는 방법이 많다고해서 모든 방법이 동등하다는 의미는 아닙니다. 사용하여 빈 문자열을 테스트 if ($foo == "")예를 들어,이다 결정적 잘못 하지 않는 한 여부를 테스트 할 실제로 평균 $foo(이 경우에는 것, 0의 값이 숫자 맥락에서 평가, 여전히 더 잘 쓸 수 if ($foo == 0)즉 더 명확하게 표현으로, 당신의 의지).
— Dave Sherohman

0

빈 문자열을 확인하려면 다음과 같이 할 수도 있습니다.

if (!defined $val || $val eq '')
{
    # empty
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.